protected override void Load(ContainerBuilder builder) { builder.RegisterType <CSharpFeatureDiscovery>() .Keyed <IFeatureDiscovery>(LanguageIdentifier.CSharp) .SingleInstance(); builder.RegisterType <VBNetFeatureDiscovery>() .Keyed <IFeatureDiscovery>(LanguageIdentifier.VBNet) .SingleInstance(); builder.RegisterType <CSharpLanguage>() .As <IRoslynLanguage>() .WithParameter(ResolvedParameter.ForKeyed <IFeatureDiscovery>(LanguageIdentifier.CSharp)) .SingleInstance(); builder.RegisterType <VBNetLanguage>() .As <IRoslynLanguage>() .WithParameter(ResolvedParameter.ForKeyed <IFeatureDiscovery>(LanguageIdentifier.VBNet)) .SingleInstance(); builder.RegisterType <CSharpDecompiler>().As <IDecompiler>().SingleInstance(); builder.RegisterType <VBNetDecompiler>().As <IDecompiler>().SingleInstance(); builder.RegisterType <ILDecompiler>().As <IDecompiler>().SingleInstance(); builder.RegisterType <CodeProcessor>().As <ICodeProcessor>().SingleInstance(); }
public void AResolvedParameterForAKeyedServiceDoesNotMatcheParametersOfTheServiceTypeWhenTheKeyedServiceIsUnavailable() { var rp = ResolvedParameter.ForKeyed <char>(new object()); var cp = GetCharParameter(); var canSupply = rp.CanSupplyValue(cp, new ContainerBuilder().Build(), out Func <object> vp); Assert.False(canSupply); }
public void AResolvedParameterForAKeyedServiceDoesNotMatcheParametersOfTheServiceTypeWhenTheKeyedServiceIsUnavailable() { var rp = ResolvedParameter.ForKeyed <char>(new object()); var cp = GetCharParameter(); Func <object> vp; var canSupply = rp.CanSupplyValue(cp, Container.Empty, out vp); Assert.That(canSupply, Is.False); }
public void AResolvedParameterForAKeyedServiceMatchesParametersOfTheServiceTypeWhenTheKeyedServiceIsAvailable() { var k = new object(); var builder = new ContainerBuilder(); builder.RegisterInstance((object)'a').Keyed <char>(k); var container = builder.Build(); var rp = ResolvedParameter.ForKeyed <char>(k); var cp = GetCharParameter(); Assert.True(rp.CanSupplyValue(cp, container, out Func <object> vp)); }
protected override void Load(ContainerBuilder builder) { builder.RegisterType <MetadataReferenceCollector>() .As <IMetadataReferenceCollector>() .SingleInstance(); builder.RegisterType <CSharpFeatureDiscovery>() .Keyed <IFeatureDiscovery>(LanguageNames.CSharp) .SingleInstance(); builder.RegisterType <VisualBasicFeatureDiscovery>() .Keyed <IFeatureDiscovery>(LanguageNames.VisualBasic) .SingleInstance(); builder.RegisterType <CSharpSetup>() .As <IMirrorSharpSetup>() .WithParameter(ResolvedParameter.ForKeyed <IFeatureDiscovery>(LanguageNames.CSharp)) .SingleInstance(); builder.RegisterType <VisualBasicSetup>() .As <IMirrorSharpSetup>() .WithParameter(ResolvedParameter.ForKeyed <IFeatureDiscovery>(LanguageNames.VisualBasic)) .SingleInstance(); builder.RegisterType <FSharpSetup>() .As <IMirrorSharpSetup>() .SingleInstance(); builder.RegisterType <Compiler>() .As <ICompiler>() .SingleInstance(); builder.RegisterType <RoslynAstTarget>().As <IAstTarget>().SingleInstance(); builder.RegisterType <FSharpAstTarget>().As <IAstTarget>().SingleInstance(); builder.RegisterType <CSharpDecompiler>().As <IDecompiler>().SingleInstance(); builder.RegisterType <VisualBasicDecompiler>().As <IDecompiler>().SingleInstance(); builder.RegisterType <ILDecompiler>().As <IDecompiler>().SingleInstance(); builder.RegisterType <JitAsmDecompiler>().As <IDecompiler>().SingleInstance(); builder.RegisterInstance(new RecyclableMemoryStreamManager()) .AsSelf(); builder.RegisterType <SlowUpdate>() .As <ISlowUpdateExtension>() .SingleInstance(); builder.RegisterType <SetOptionsFromClient>() .As <ISetOptionsFromClientExtension>() .SingleInstance(); }
public CompositionRoot() { var builder = new ContainerBuilder(); builder.RegisterType <SomeService>() .WithParameter(ResolvedParameter.ForKeyed <Func <DbContext> >("Some")); builder.RegisterType <AnotherService>() .WithParameter(ResolvedParameter.ForKeyed <Func <DbContext> >("Another")); builder.RegisterInstance <Func <DbContext> >(() => new DbContext("Some")) .Keyed <Func <DbContext> >("Some"); builder.RegisterInstance <Func <DbContext> >(() => new DbContext("Another")) .Keyed <Func <DbContext> >("Another"); _root = builder.Build(); }
protected override void Load(ContainerBuilder builder) { builder.RegisterType<MetadataReferenceCollector>() .As<IMetadataReferenceCollector>() .SingleInstance(); builder.RegisterType<CSharpFeatureDiscovery>() .Keyed<IFeatureDiscovery>(LanguageNames.CSharp) .SingleInstance(); builder.RegisterType<VisualBasicFeatureDiscovery>() .Keyed<IFeatureDiscovery>(LanguageNames.VisualBasic) .SingleInstance(); builder.RegisterType<CSharpAdapter>() .As<ILanguageAdapter>() .WithParameter(ResolvedParameter.ForKeyed<IFeatureDiscovery>(LanguageNames.CSharp)) .SingleInstance(); builder.RegisterType<VisualBasicAdapter>() .As<ILanguageAdapter>() .WithParameter(ResolvedParameter.ForKeyed<IFeatureDiscovery>(LanguageNames.VisualBasic)) .SingleInstance(); builder.RegisterType<FSharpAdapter>() .As<ILanguageAdapter>() .SingleInstance(); builder.RegisterType<PhpAdapter>() .As<ILanguageAdapter>() .SingleInstance(); builder.RegisterType<Compiler>() .As<ICompiler>() .SingleInstance(); builder.RegisterType<RoslynAstTarget>().As<IAstTarget>().SingleInstance(); builder.RegisterType<FSharpAstTarget>().As<IAstTarget>().SingleInstance(); builder.RegisterType<PhpAstTarget>().As<IAstTarget>().SingleInstance(); builder.RegisterType<CSharpDecompiler>().As<IDecompiler>().SingleInstance(); builder.RegisterType<VisualBasicDecompiler>().As<IDecompiler>().SingleInstance(); builder.RegisterType<ILDecompiler>().As<IDecompiler>().SingleInstance(); builder.RegisterType<JitAsmDecompiler>().As<IDecompiler>().SingleInstance(); builder.RegisterType<Executor>() .As<IExecutor>() .SingleInstance(); builder.RegisterType<FlowReportingRewriter>() .As<IAssemblyRewriter>() .SingleInstance(); builder.RegisterType<FSharpEntryPointRewriter>() .As<IAssemblyRewriter>() .SingleInstance(); builder.RegisterInstance(new RecyclableMemoryStreamManager()) .AsSelf(); builder.RegisterType<DefaultTraceMonitor>() .As<IMonitor>() .SingleInstance() .PreserveExistingDefaults(); builder.RegisterType<MonitorExceptionLogger>() .As<IExceptionLogger>() .SingleInstance(); builder.RegisterType<SlowUpdate>() .As<ISlowUpdateExtension>() .SingleInstance(); builder.RegisterType<SetOptionsFromClient>() .As<ISetOptionsFromClientExtension>() .SingleInstance(); }
protected override void Load(ContainerBuilder builder) { builder.RegisterType <UserOption>().As <IOption <User> >().SingleInstance(); builder.RegisterType <DataModeOption>().As <IOption <DataMode> >().SingleInstance(); var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var usersConnectionString = $"Data Source={Path.Combine(folderPath, "Users.db3")};Version=3;"; var ordersConnectionString = $"Data Source={Path.Combine(folderPath, "Orders.db3")};Version=3;"; builder.RegisterInstance <IDbConnection>(new SQLiteConnection(usersConnectionString)).Keyed <IDbConnection>(Database.Users).SingleInstance(); builder.RegisterInstance <IDbConnection>(new SQLiteConnection(ordersConnectionString)).Keyed <IDbConnection>(Database.Orders).SingleInstance(); builder.RegisterType <DapperWrapper>().As <IDapperWrapper>().WithParameter(ResolvedParameter.ForKeyed <IDbConnection>(Database.Orders)).Keyed <IDapperWrapper>(Database.Orders).InstancePerLifetimeScope(); builder.RegisterType <DapperWrapper>().As <IDapperWrapper>().WithParameter(ResolvedParameter.ForKeyed <IDbConnection>(Database.Users)).Keyed <IDapperWrapper>(Database.Users).InstancePerLifetimeScope(); builder.RegisterType <LoginRepository>().As <ILoginRepository>() .WithParameters(new[] { ResolvedParameter.ForKeyed <IDapperWrapper>(Database.Users), ResolvedParameter.ForKeyed <IValidator <User> >(Validator.Login) }).InstancePerLifetimeScope(); builder.RegisterType <RegisterRepository>().As <IRegisterRepository>() .WithParameters(new[] { ResolvedParameter.ForKeyed <IDapperWrapper>(Database.Users), ResolvedParameter.ForKeyed <IValidator <User> >(Validator.Register) }).InstancePerLifetimeScope(); builder.RegisterType <RegisterUserValidator>().As <IValidator <User> >().Keyed <IValidator <User> >(Validator.Register) .WithParameter(ResolvedParameter.ForKeyed <IDapperWrapper>(Database.Users)).InstancePerLifetimeScope(); builder.RegisterType <LoginUserValidator>().As <IValidator <User> >().Keyed <IValidator <User> >(Validator.Login) .WithParameter(ResolvedParameter.ForKeyed <IDapperWrapper>(Database.Users)).InstancePerLifetimeScope(); builder.RegisterType <BrickLinkRequestFactory>().As <IBrickLinkRequestFactory>(); builder.Register <Func <User, IBrickLinkRequestFactory> >(context => { var cc = context.Resolve <IComponentContext>(); return(user => cc.Resolve <IBrickLinkRequestFactory>(TypedParameter.From(user))); }); builder.RegisterType <ItemImageRepository>().As <IItemImageRepository>().InstancePerLifetimeScope(); builder.RegisterType <BrickLinkAPI.OrderRepository>().As <IOrderRepository>().Keyed <IOrderRepository>(DataMode.API).InstancePerLifetimeScope(); builder.RegisterType <LocalDB.OrderRepository>().As <IOrderRepository>().Keyed <IOrderRepository>(DataMode.Database).InstancePerLifetimeScope(); builder.Register <Func <IOrderRepository> >(context => { var cc = context.Resolve <IComponentContext>(); return(() => { var mode = cc.Resolve <IOption <DataMode> >().Value; return mode switch { DataMode.Database => cc.ResolveKeyed <IOrderRepository>(mode, ResolvedParameter.ForKeyed <IDapperWrapper>(Database.Orders)), DataMode.API => cc.ResolveKeyed <IOrderRepository>(mode), _ => null }; }); }); builder.RegisterType <DatabaseUpdater>().As <IDatabaseUpdater>() .WithParameters(new[] { ResolvedParameter.ForKeyed <IDapperWrapper>(Database.Orders), ResolvedParameter.ForKeyed <IOrderRepository>(DataMode.API) }).InstancePerLifetimeScope(); builder.RegisterType <OrdersDatabaseInitializer>().As <IDatabaseInitializer>().Keyed <IDatabaseInitializer>(Database.Orders) .WithParameter(ResolvedParameter.ForKeyed <IDapperWrapper>(Database.Orders)).InstancePerLifetimeScope(); builder.RegisterType <UsersDatabaseInitializer>().As <IDatabaseInitializer>().Keyed <IDatabaseInitializer>(Database.Users) .WithParameter(ResolvedParameter.ForKeyed <IDapperWrapper>(Database.Users)).InstancePerLifetimeScope(); }
protected override void Load(ContainerBuilder builder) { builder.RegisterModule <IoCDataModule>(); // MainStage { // Register keyed main View/Presenter builder.RegisterType <MainStageView>().As <IMainStageView>().Keyed <IStageView>(Key.MainStage).InstancePerLifetimeScope(); // Parameters must be specified because dependencies have multiple types registered builder.RegisterType <MainStagePresenter>().As <IStagePresenter>().Keyed <IStagePresenter>(Key.MainStage) .WithParameters(new[] { // Resolve IStageView keyed with Key.Main ResolvedParameter.ForKeyed <IMainStageView>(Key.MainStage), // Resolve IPresenter factory keyed with PresenterType.Order ResolvedParameter.ForKeyed <Func <IPresenter> >(Key.Order), // Resolve IDatabaseInitializer keyed with Database.Orders ResolvedParameter.ForKeyed <IDatabaseInitializer>(Database.Orders) }).InstancePerLifetimeScope(); // Register ToolStripRenderer for MainStageView builder.RegisterInstance(new ToolStripProfessionalRenderer(new MenuColorTable())).As <ToolStripRenderer>(); } // ChildStage { // Register keyed child View/Presenter builder.RegisterType <ChildStageView>().As <IStageView>().Keyed <IStageView>(Key.ChildStage).InstancePerLifetimeScope(); // Parameters must be specified because dependencies have multiple types registered builder.RegisterType <ChildStagePresenter>().As <IStagePresenter>().AsSelf().Keyed <IStagePresenter>(Key.ChildStage) .WithParameters(new[] { // Resolve IStageView keyed with Key.ChildStage ResolvedParameter.ForKeyed <IStageView>(Key.ChildStage), // Resolve IPresenter factory keyed with PresenterType.Login // Parameter name must be specified as ChildStagePresenter takes 2 different IPresenter factories new ResolvedParameter( (pi, ctx) => pi.ParameterType == typeof(Func <Action, IPresenter>) && pi.Name == "loginPresenterFactory", (pi, ctx) => ctx.ResolveKeyed <Func <Action, IPresenter> >(Key.Login) ), // Resolve IPresenter factory keyed with PresenterType.Register // Parameter name must be specified as ChildStagePresenter takes 2 different IPresenter factories new ResolvedParameter( (pi, ctx) => pi.ParameterType == typeof(Func <Action, IPresenter>) && pi.Name == "registerPresenterFactory", (pi, ctx) => ctx.ResolveKeyed <Func <Action, IPresenter> >(Key.Register) ), // Resolve IDatabaseInitializer keyed with Database.Orders ResolvedParameter.ForKeyed <IDatabaseInitializer>(Database.Users) }).InstancePerLifetimeScope(); // Register an IStagePresenter factory that returns a child stage Presenter with the InitialView property set builder.Register <Func <ChildStageViewType, Action, IStagePresenter> >(context => { var cc = context.Resolve <IComponentContext>(); return((initialView, action) => { var presenter = cc.ResolveKeyed <IStagePresenter>(Key.ChildStage, TypedParameter.From(action)) as ChildStagePresenter; presenter.InitialView = initialView; return presenter; }); }); } // Order { // Register order View/Presenter keyed with PresenterType.Order builder.RegisterType <OrderView>().As <IOrderView>(); builder.RegisterType <OrderPresenter>().As <IPresenter>().Keyed <IPresenter>(Key.Order).WithParameter(ResolvedParameter.ForKeyed <IStagePresenter>(Key.MainStage)); // Register IPresenter factory which returns IPresenter keyed with PresenterType.Order builder.Register <Func <IPresenter> >(context => { var cc = context.Resolve <IComponentContext>(); return(() => cc.ResolveKeyed <IPresenter>(Key.Order)); }).Keyed <Func <IPresenter> >(Key.Order); } // Item { // Register item View/Presenter builder.RegisterType <ItemView>().As <IItemView>(); builder.RegisterType <ItemPresenter>().As <IPresenter>().Keyed <IPresenter>(Key.Item).WithParameter(ResolvedParameter.ForKeyed <IStagePresenter>(Key.MainStage)); // Register ItemPresenter factory builder.Register <Func <IReadOnlyList <Item>, Action, IPresenter> >(context => { var cc = context.Resolve <IComponentContext>(); return((items, action) => cc.ResolveKeyed <IPresenter>(Key.Item, TypedParameter.From(items), TypedParameter.From(action))); }); } // Login { // Register login View/Presenter keyed with PresenterType.Login builder.RegisterType <LoginView>().As <ILoginView>(); builder.RegisterType <LoginPresenter>().As <IPresenter>().Keyed <IPresenter>(Key.Login).WithParameter(ResolvedParameter.ForKeyed <IStagePresenter>(Key.ChildStage)); // Register IPresenter factory which returns IPresenter keyed with PresenterType.Login builder.Register <Func <Action, IPresenter> >(context => { var cc = context.Resolve <IComponentContext>(); return(action => cc.ResolveKeyed <IPresenter>(Key.Login, TypedParameter.From(action))); }).Keyed <Func <Action, IPresenter> >(Key.Login); } // Register { // Register register View/Presenter keyed with PresenterType.Register builder.RegisterType <RegisterView>().As <IRegisterView>(); builder.RegisterType <RegisterPresenter>().As <IPresenter>().Keyed <IPresenter>(Key.Register).WithParameter(ResolvedParameter.ForKeyed <IStagePresenter>(Key.ChildStage)); // Register IPresenter factory which returns IPresenter keyed with PresenterType.Register builder.Register <Func <Action, IPresenter> >(context => { var cc = context.Resolve <IComponentContext>(); return(action => cc.ResolveKeyed <IPresenter>(Key.Register, TypedParameter.From(action))); }).Keyed <Func <Action, IPresenter> >(Key.Register); } // Mappers { builder.RegisterType <DtoMapper>().As <IDtoMapper>().InstancePerLifetimeScope(); builder.RegisterType <VmMapper>().As <IVmMapper>().InstancePerLifetimeScope(); } // Filtering { builder.RegisterType <OrderFilterer>().As <IOrderFilterer>().InstancePerLifetimeScope(); builder.RegisterType <ItemFilterer>().As <IItemFilterer>().InstancePerLifetimeScope(); // Any/All filter strategies { builder.RegisterType <FilterAnyStrategy>().As <IAnyAllFilterModeStrategy>().Keyed <IAnyAllFilterModeStrategy>(AnyAllFilterMode.Any).InstancePerLifetimeScope(); builder.RegisterType <FilterAllStrategy>().As <IAnyAllFilterModeStrategy>().Keyed <IAnyAllFilterModeStrategy>(AnyAllFilterMode.All).InstancePerLifetimeScope(); // Register an IAnyAllFilterModeStrategy factory which returns the strategy keyed with the AnyAllFilterMode provided builder.Register <Func <AnyAllFilterMode, IAnyAllFilterModeStrategy> >(context => { var cc = context.Resolve <IComponentContext>(); return(mode => cc.ResolveKeyed <IAnyAllFilterModeStrategy>(mode)); }); } // Min/Max filter strategies { builder.RegisterType <OrderItemCountFilterMaxStrategy>().As <IMinMaxFilterModeStrategy <Order> >().Keyed <IMinMaxFilterModeStrategy <Order> >(MinMaxFilterMode.Max); builder.RegisterType <OrderItemCountFilterMinStrategy>().As <IMinMaxFilterModeStrategy <Order> >().Keyed <IMinMaxFilterModeStrategy <Order> >(MinMaxFilterMode.Min); // Register an IMinMaxFilterModeStrategy factory which returns the strategy keyed with the MinMaxFilterMode provided builder.Register <Func <string, MinMaxFilterMode, IMinMaxFilterModeStrategy <Order> > >(context => { var cc = context.Resolve <IComponentContext>(); return((countType, mode) => { int getItemCountProperty(Order order) => countType switch { nameof(Order.TotalCount) => order.TotalCount, nameof(Order.UniqueCount) => order.UniqueCount, _ => default }; return cc.ResolveKeyed <IMinMaxFilterModeStrategy <Order> >(mode, TypedParameter.From <Func <Order, int> >(getItemCountProperty)); }); }); builder.RegisterType <ItemCountFilterMaxStrategy>().As <IMinMaxFilterModeStrategy <ItemVm> >().Keyed <IMinMaxFilterModeStrategy <ItemVm> >(MinMaxFilterMode.Max); builder.RegisterType <ItemCountFilterMinStrategy>().As <IMinMaxFilterModeStrategy <ItemVm> >().Keyed <IMinMaxFilterModeStrategy <ItemVm> >(MinMaxFilterMode.Min); // Register an IMinMaxFilterModeStrategy factory which returns the strategy keyed with the MinMaxFilterMode provided builder.Register <Func <MinMaxFilterMode, IMinMaxFilterModeStrategy <ItemVm> > >(context => { var cc = context.Resolve <IComponentContext>(); return(mode => cc.ResolveKeyed <IMinMaxFilterModeStrategy <ItemVm> >(mode)); }); } // Strict/Loose filter strategies { builder.RegisterType <OrderSearchFilterStrictStrategy>().As <IStrictLooseFilterModeStrategy <Order> >().Keyed <IStrictLooseFilterModeStrategy <Order> >(StrictLooseFilterMode.Strict); builder.RegisterType <OrderSearchFilterLooseStrategy>().As <IStrictLooseFilterModeStrategy <Order> >().Keyed <IStrictLooseFilterModeStrategy <Order> >(StrictLooseFilterMode.Loose); builder.Register <Func <string, StrictLooseFilterMode, IStrictLooseFilterModeStrategy <Order> > >(context => { var cc = context.Resolve <IComponentContext>(); return((searchType, mode) => { string getOrderProperty(Order order) => searchType switch { nameof(Order.Id) => order.Id.ToString(), nameof(Order.BuyerName) => order.BuyerName, _ => default }; return cc.ResolveKeyed <IStrictLooseFilterModeStrategy <Order> >(mode, TypedParameter.From <Func <Order, string> >(getOrderProperty)); }); }); builder.RegisterType <ItemSearchFilterStrictStrategy>().As <IStrictLooseFilterModeStrategy <ItemVm> >().Keyed <IStrictLooseFilterModeStrategy <ItemVm> >(StrictLooseFilterMode.Strict); builder.RegisterType <ItemSearchFilterLooseStrategy>().As <IStrictLooseFilterModeStrategy <ItemVm> >().Keyed <IStrictLooseFilterModeStrategy <ItemVm> >(StrictLooseFilterMode.Loose); builder.Register <Func <string, StrictLooseFilterMode, IStrictLooseFilterModeStrategy <ItemVm> > >(context => { var cc = context.Resolve <IComponentContext>(); return((searchType, mode) => { string getItemProperty(ItemVm item) => searchType switch { nameof(ItemVm.Number) => item.Number, nameof(ItemVm.InventoryId) => item.InventoryId.ToString(), nameof(ItemVm.Name) => item.Name, _ => default }; return cc.ResolveKeyed <IStrictLooseFilterModeStrategy <ItemVm> >(mode, TypedParameter.From <Func <ItemVm, string> >(getItemProperty)); }); }); } } }