{"id":16245902,"url":"https://github.com/dansiegel/prismgracedemo","last_synced_at":"2025-08-08T02:04:55.545Z","repository":{"id":80280406,"uuid":"155131870","full_name":"dansiegel/PrismGraceDemo","owner":"dansiegel","description":"Sample project implementing support for a non-Prism supported IOC Container","archived":false,"fork":false,"pushed_at":"2018-10-29T06:15:36.000Z","size":514,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-08T11:40:21.756Z","etag":null,"topics":["grace","ioc","prism"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dansiegel.png","metadata":{"files":{"readme":"ReadMe.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-29T01:00:46.000Z","updated_at":"2018-10-29T06:15:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"df6ed982-4f4d-4356-aa75-5df639d8e87f","html_url":"https://github.com/dansiegel/PrismGraceDemo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dansiegel/PrismGraceDemo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dansiegel%2FPrismGraceDemo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dansiegel%2FPrismGraceDemo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dansiegel%2FPrismGraceDemo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dansiegel%2FPrismGraceDemo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dansiegel","download_url":"https://codeload.github.com/dansiegel/PrismGraceDemo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dansiegel%2FPrismGraceDemo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269351910,"owners_count":24402678,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-08T02:00:09.200Z","response_time":72,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["grace","ioc","prism"],"created_at":"2024-10-10T14:28:35.623Z","updated_at":"2025-08-08T02:04:55.537Z","avatar_url":"https://github.com/dansiegel.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Prism Ioc Demo\n\nThe Prism team cannot support every container out there. Looking at Ioc Performance Benchmarks you may feel you want to use a non-supported container such as Grace. While Grace's [performance metrics](https://github.com/danielpalme/IocPerformance#basic-features) are fantastic, it currently does not have enough of a following to justify adding it as an official container.\n\n## Popup Plugin Compatible\n\nBecause of the container abstraction, the Popup Plugin remains fully compatible with our application while only ever providing that single class.\n\n## Container Extension\n\nPrism 7's Ioc Abstractions make supporting new containers extremely easy. As you'll see from this demo app, we only have to add a single class implementing IContainerExtension.\n\n```cs\npublic class GraceContainerExtension : IContainerExtension\u003cIInjectionScope\u003e\n{\n    public GraceContainerExtension()\n        : this(new DependencyInjectionContainer())\n    {\n    }\n\n    public GraceContainerExtension(IInjectionScope injectionScope)\n    {\n        Instance = injectionScope;\n    }\n\n    public IInjectionScope Instance { get; }\n\n    public bool SupportsModules =\u003e true;\n\n    public void FinalizeExtension() { }\n\n    public void Register(Type from, Type to) =\u003e\n        Instance.Configure(c =\u003e c.Export(to).As(from));\n\n    public void Register(Type from, Type to, string name) =\u003e\n        Instance.Configure(c =\u003e c.Export(to).AsKeyed(from, name));\n\n    public void RegisterInstance(Type type, object instance) =\u003e\n        Instance.Configure(c =\u003e c.ExportInstance(instance).As(type));\n\n    public void RegisterSingleton(Type from, Type to) =\u003e\n        Instance.Configure(c =\u003e c.Export(to).As(from).Lifestyle.Singleton());\n\n    public object Resolve(Type type) =\u003e\n        Instance.Locate(type);\n\n    public object Resolve(Type type, string name) =\u003e\n        Instance.Locate(type, withKey: name);\n\n    public object ResolveViewModelForView(object view, Type viewModelType)\n    {\n        Page page = null;\n\n        switch(view)\n        {\n            case Page viewAsPage:\n                page = viewAsPage;\n                break;\n            case BindableObject bindable:\n                page = bindable.GetValue(ViewModelLocator.AutowirePartialViewProperty) as Page;\n                break;\n            default:\n                return Instance.Locate(viewModelType);\n        }\n\n        var navService = Instance.Locate\u003cINavigationService\u003e(withKey: PrismApplicationBase.NavigationServiceName);\n        ((IPageAware)navService).Page = page;\n        return Instance.Locate(viewModelType, new[] { navService });\n    }\n}\n```\n\nInstead of inheriting from a PrismApplication we can inherit directly from PrismApplicationBase and pass back our GraceContainerExtension for `CreateContainerExtension()`.\n\n```cs\npublic partial class App\n{\n    public App() : base() { }\n\n    public App(IPlatformInitializer initializer) : base(initializer) { }\n\n    protected override IContainerExtension CreateContainerExtension() =\u003e\n        new GraceContainerExtension();\n\n    protected override void OnInitialized()\n    {\n        InitializeComponent();\n        NavigationService.NavigateAsync(\"MainPage?message=Hello%20From%20Prism\");\n    }\n\n    protected override void RegisterTypes(IContainerRegistry containerRegistry)\n    {\n        containerRegistry.RegisterForNavigation\u003cMainPage\u003e();\n    }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdansiegel%2Fprismgracedemo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdansiegel%2Fprismgracedemo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdansiegel%2Fprismgracedemo/lists"}