【问题标题】:StructureMap and named instancesStructureMap 和命名实例
【发布时间】:2010-07-06 23:05:34
【问题描述】:

我不确定为什么以下内容不起作用。 StructureMap 告诉我没有为 SomeClassWithDependencies...um...dependencies 定义默认依赖项。任何人都可以对此有所了解吗?我想通过基于命名实例的整个依赖树来构造对象。我是不是找错树了?

public class Program
{
    static void Main(string[] args)
    {
        ObjectFactory.Initialize(x=>x.AddRegistry(new MyRegistry()));


        ISomeClassWithDependencies someClassWithDependencies = ObjectFactory.GetNamedInstance<ISomeClassWithDependencies>("name1");
    }
}
public interface ISomeClassWithDependencies
{
}

public class SomeClassWithDependencies : ISomeClassWithDependencies
{
    public IEnumerable<IValidator> Validators { get; private set; }

    public SomeClassWithDependencies(IEnumerable<IValidator> type1s)
    {
        Validators = type1s;
    }
}

public class MyRegistry : Registry
{
    public MyRegistry()
    {
        ForRequestedType<ISomeClassWithDependencies>().AddInstances(
            x => x.Is.OfConcreteType<SomeClassWithDependencies>().WithName("name1"));
        ForRequestedType<IEnumerable<IValidator>>().AddInstances(x=>x.ConstructedBy(BuildValidators).WithName("name1"));
        ForRequestedType<IEnumerable<IValidator>>().AddInstances(x => x.ConstructedBy(BuildValidators2).WithName("name2"));
    }

    public IEnumerable<IValidator> BuildValidators()
    {
        var validatorOne = ObjectFactory.GetInstance<Validator1>();
        var validatorTwo = ObjectFactory.GetInstance<Validator2>();

        return new List<IValidator> { validatorOne, validatorTwo };
    }

    public IEnumerable<IValidator> BuildValidators2()
    {
        var validatorOne = ObjectFactory.GetInstance<Validator1>();

        return new List<IValidator> { validatorOne };
    }
}

【问题讨论】:

    标签: .net dependency-injection structuremap


    【解决方案1】:

    首先,您将两个不同的实例命名为“name1”,其次,IEnumerables、数组和IList/List&lt;T&gt;s 由 StructureMap 特殊处理,并忽略对例如Ctor&lt;IEnumerable&lt;T&gt;&gt;() 的调用。

    您可以(仅)在注册表中使用它(2.6.1 语法):

    For<ISomeClassWithDependencies>().Use<SomeClassWithDependencies>()
                .EnumerableOf<IValidator>("type1s").Contains(
                x =>
                    {
                        x.Type<Validator1>();
                        x.Type<Validator2>();
                    }
                );
    

    并使用

    创建实例
    var someClassWithDependencies =
                ObjectFactory.GetInstance<ISomeClassWithDependencies>();
    

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多