StructureMap и именованные экземпляры - PullRequest
0 голосов
/ 07 июля 2010

Я не уверен, почему следующее не работает. StructureMap говорит мне, что для SomeClassWithDependencies не определено никаких зависимостей по умолчанию Кто-нибудь может пролить свет на это? Я хочу построить объект через все дерево зависимостей на основе именованных экземпляров. Я лаю не на том дереве?

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

1 Ответ

1 голос
/ 08 сентября 2010

Во-первых, вы назвали два разных экземпляра для «name1», во-вторых, IEnumerables, массивы и IList/List<T> s специально обрабатываются StructureMap, а вызовы, например, Ctor<IEnumerable<T>>() игнорируются.

Вы можете использовать(только) это в вашем реестре (синтаксис 2.6.1):

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

и создайте экземпляр, используя

var someClassWithDependencies =
            ObjectFactory.GetInstance<ISomeClassWithDependencies>();
...