如何使用 StructureMap 将不同的混凝土绑定到 属性

How Do I Bind Different Concretes to a Property Using StructureMap

他们在我目前工作的地方使用 StructureMap for IoC。

我有一个应用程序 class 将实现同一接口的多个属性...我需要绑定不同的实现

...不,我不能这样做: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 Configuration

the setter policies in the next section can still be filled by StructureMap if an inline dependency is configured matching that setter property as shown in the example below:

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>();            
    }
}

原答案

如果您能够修改实现和目标 class 然后尝试区分预期的依赖项。

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));

它将获取预期的实现并绑定它们。