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));
        }
Ejemplo n.º 2
0
        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
        }
Ejemplo n.º 3
0
        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);
            }
        }