public object GetService(IContainerRegistry registry, Type serviceType) { if (!registry.Registered(serviceType)) { throw new Exception($"Type {serviceType.FullName} is not registered."); } var registration = registry.Get(serviceType); return(_resolvers[registration.Lifetime].Resolve(registration, registry)); }
protected override void RegisterTypes(IContainerRegistry containerRegistry) { // Register the Popup Plugin Navigation Service containerRegistry.RegisterPopupNavigationService(); containerRegistry.RegisterInstance(CreateLogger()); #if (UseRealm) //var serverURL = new Uri(Secrets.RealmServer); //var config = new SyncConfiguration(User.Current, serverURL); var config = RealmConfiguration.DefaultConfiguration; #if (AutofacContainer) containerRegistry.GetBuilder().Register(ctx => Realm.GetInstance(config)).As<Realm>().InstancePerDependency(); #elseif (DryIocContainer) containerRegistry.GetContainer().Register(reuse: Reuse.Transient, made: Made.Of(() => Realm.GetInstance(config)), setup: Setup.With(allowDisposableTransient: true)); #else containerRegistry.GetContainer().RegisterType<Realm>(new InjectionFactory(c => Realm.GetInstance(config))); #endif #endif #if (UseAzureMobileClient) containerRegistry.RegisterSingleton(typeof(ICloudTable<>), typeof(AzureCloudTable<>)); containerRegistry.RegisterSingleton(typeof(ICloudSyncTable<>), typeof(AzureCloudSyncTable<>)); #if (NoAuth) containerRegistry.RegisterInstance<IMobileServiceClient>(new MobileServiceClient(Secrets.AppServiceEndpoint)); #else #if (AADAuth || AADB2CAuth) containerRegistry.RegisterInstance<IPublicClientApplication>( new PublicClientApplication(Secrets.AuthClientId, AppConstants.Authority) { RedirectUri = AppConstants.RedirectUri }); #if (AutofacContainer) containerRegistry.GetBuilder().RegisterType<AppDataContext>().As<IAppDataContext>().As<ICloudAppContext>().SingleInstance(); #elseif (DryIocContainer) containerRegistry.GetContainer().RegisterMany<AppDataContext>(reuse: Reuse.Singleton, serviceTypeCondition: type => type == typeof(IAppDataContext) || type == typeof(ICloudAppContext)); #elseif (NinjectContainer) containerRegistry.GetContainer().Bind<IAppDataContext, ICloudAppContext>().To<AppDataContext>().InSingletonScope(); #elseif (UnityContainer) containerRegistry.GetContainer().RegisterType<AppDataContext>(new ContainerControlledLifetimeManager()); containerRegistry.GetContainer().RegisterType<IAppDataContext>(new InjectionFactory(c => c.Resolve<AppDataContext>())); containerRegistry.GetContainer().RegisterType<ICloudAppContext>(new InjectionFactory(c => c.Resolve<AppDataContext>())); #endif #endif containerRegistry.RegisterSingleton<IAzureCloudServiceOptions, AppServiceContextOptions>(); #if (AutofacContainer) containerRegistry.GetBuilder().RegisterType<AppDataContext>().As<IAppDataContext>().As<ICloudService>().SingleInstance(); containerRegistry.GetBuilder().Register(ctx => ctx.Resolve<ICloudService>().Client).As<IMobileServiceClient>().SingleInstance(); #elseif (DryIocContainer) containerRegistry.GetContainer().RegisterMany<AppDataContext>(reuse: Reuse.Singleton, serviceTypeCondition: type => type == typeof(IAppDataContext) || type == typeof(ICloudService)); containerRegistry.GetContainer().RegisterDelegate<IMobileServiceClient>(factoryDelegate: r => r.Resolve<ICloudService>().Client, reuse: Reuse.Singleton, setup: Setup.With(allowDisposableTransient: true)); #elseif (NinjectContainer) containerRegistry.Bind<IAppDataContext, ICloudService>().To<AppDataContext>().InSingletonScope(); containerRegistry.Bind<IMobileServiceClient>().ToMethod(c => containerRegistry.Get<ICloudService>().Client).InSingletonScope(); #elseif (UnityContainer) containerRegistry.GetContainer().RegisterType<IAppDataContext>(new InjectionFactory(c => c.Resolve<AppDataContext>())); containerRegistry.GetContainer().RegisterType<ICloudService>(new InjectionFactory(c => c.Resolve<AppDataContext>())); containerRegistry.GetContainer().RegisterType<IMobileServiceClient>(new InjectionFactory(c => c.Resolve<ICloudService>().Client)); #endif containerRegistry.RegisterSingleton<ILoginProvider<AADAccount>, LoginProvider>(); #endif #if (IncludeBarcodeService) // NOTE: Uses a Popup Page to contain the Scanner. You can optionally register // the ContentPageBarcodeScannerService if you prefer a full screen approach. containerRegistry.RegisterSingleton<IBarcodeScannerService, PopupBarcodeScannerService>(); #endif #if (UseAcrDialogs) containerRegistry.RegisterInstance<IUserDialogs>(UserDialogs.Instance); #endif // Navigating to "TabbedPage?createTab=ViewA&createTab=ViewB&createTab=ViewC will generate a TabbedPage // with three tabs for ViewA, ViewB, & ViewC // Adding `selectedTab=ViewB` will set the current tab to ViewB containerRegistry.RegisterForNavigation<TabbedPage>(); containerRegistry.RegisterForNavigation<NavigationPage>(); containerRegistry.RegisterForNavigation<MainPage>(); #if (!Empty) containerRegistry.RegisterForNavigation<SplashScreenPage>(); containerRegistry.RegisterForNavigation<TodoItemDetail>(); #endif }
public object Resolve(IRegistration registration, IContainerRegistry registry) { if (registration == null) { throw new ArgumentNullException(nameof(registration)); } if (registry == null) { throw new ArgumentNullException(nameof(registry)); } if (registration.Type.IsInterface && registration.Implementation != null) { // Interface and Implementation present var implementation = Resolve(new Registration(registration.Implementation, Lifetime.Transient), registry); return(implementation); } if (registration.Type.IsInterface && registration.Implementation == null) { // Interface is present, look for implementation in IContainerRegistry var subType = registry.GetSubTypeRegistered(registration.Type); if (subType != null) { var implementation = Resolve(new Registration(subType, Lifetime.Transient), registry); return(implementation); } throw new Exception($"Could not infer implementation of type {registration.Type.FullName}."); } var serviceType = registration.Type; var constructor = registration.Type.GetValidConstructor(); var requiredConstructorParams = constructor.GetRequiredParameters().ToList(); if (requiredConstructorParams.Any(param => registry.Get(param) == null)) { throw new Exception("Required constructor parameter not registered."); } var @params = new List <object>(); foreach (var requiredConstructorParam in requiredConstructorParams) { var dependency = Resolve(new Registration(requiredConstructorParam, Lifetime.Singleton), registry); @params.Add(dependency); } if (@params.Any()) { var requiredObject = Activator.CreateInstance(serviceType, @params.FirstOrDefault()); return(requiredObject); } else { var requiredObject = Activator.CreateInstance(serviceType); return(requiredObject); } }