簡體   English   中英

如何使用StructureMap將不同的混凝土綁定到屬性

[英]How Do I Bind Different Concretes to a Property Using StructureMap

他們在我目前正在工作的IoC中使用StructureMap。

我有一個應用程序類,將實現相同接口的多個屬性...我需要綁定不同的實現

......不,我不能這樣做: IProvider<T>

例如:

    public class MyApplication
    {
        [SetterProperty]
        public IProvider OneProvider { get; set; }

        [SetterProperty]
        public IProvider TwoProvider { get; set; }
    }

    public class FooProvider: IProvider {
        // I would like to force this one to bind-on OneProvider ...
    }
    public class BarProvider: IProvider {
        // I would like to force this one to bind-on TwoProvider ...
    }

例如,在Unity中,有很多方法可以做到這一點;

[Dependency("FooProvider")]
public IProvider OneProvider { get; set; }

[Dependency("BarProvider")]
public IProvider TwoProvider { get; set; }

...但是,StructureMaps SetterProperty屬性不允許這樣做。

題:
如何將不同的實現綁定到實例屬性?

樣本登記:
這是我的注冊表可能是什么樣子的一個例子......

public ContainerRegistry()
{
    Scan(
        scan =>
        {
            scan.TheCallingAssembly();
            scan.WithDefaultConventions();
            scan.LookForRegistries();
            scan.AssembliesFromApplicationBaseDirectory(f => f.FullName.StartsWith("My.Awesome.Company", true, null));
            scan.AddAllTypesOf(typeof(IApplication));
            scan.AddAllTypesOf(typeof(IManager<>));
            scan.AddAllTypesOf(typeof(IProvider));
            scan.AddAllTypesOf(typeof(IUnitOfWorkFactory<>));
            scan.SingleImplementationsOfInterface();
        });

    For(typeof(IApplication)).Use(typeof(MyApplication));
} 

更新

根據文檔,您可以使用Inline Setter配置

如果內聯依賴項配置為匹配該setter屬性,則下一部分中的setter策略仍可由StructureMap填充,如下例所示:

public class MyApplication : IApplication {
    public IProvider OneProvider { get; set; }
    public IProvider TwoProvider { get; set; }
}


public class RuleWithSettersRegistry : Registry {
    public RuleWithSettersRegistry() {

        //...other code removed for brevity

        For<IApplication>().Use<MyApplication>()
            // I would like to force FooProvider to bind-on OneProvider        
            .Setter(x => x.OneProvider).Is<FooProvider>()
            // I would like to force BarProvider to bind-on TwoProvider
            .Setter(x => x.TwoProvider).Is<BarProvider>();            
    }
}

原始答案

如果您能夠修改實現和目標類,那么嘗試區分預期的依賴項。

public interface IFooProvider : IProvider { }

public interface IFooProvider : IProvider { }

有實現

public class MyApplication {
    [SetterProperty]
    public IFooProvider OneProvider { get; set; }

    [SetterProperty]
    public IBarProvider TwoProvider { get; set; }
}

public class FooProvider: IFooProvider { }

public class BarProvider: IBarProvider { }

這樣就可以注冊所有IProvider派生的實現

scan.AddAllTypesOf(typeof(IProvider));

它將獲取預期的實現並綁定它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM