Autofac против Structuremap, как мне внедрить все экземпляры интерфейса? - PullRequest
4 голосов
/ 23 марта 2012

В autoFac я могу зарегистрировать несколько реализаций интерфейса.Когда autofac создает мой объект, все экземпляры передаются в конструктор.

Из документации autofac: here

Например, когда Autofac вводит параметр конструкторатипа IEnumerable он не будет искать компонент, который предоставляет IEnumerable.Вместо этого контейнер найдет все реализации ITask и внедрит их все.

Доступна ли эта функция в StructureMap?

Для моих классов:

public interface IFoo
{

}

public class Foo1 : IFoo
{

}

public class Foo2 : IFoo
{

}

public class UsingFoo
{
    public UsingFoo(IEnumerable<IFoo> allFoos)
    {
        foreach (var foo in allFoos)
        {

        }
    }
}

Как зарегистрировать мои реализации, чтобы при создании экземпляра UsingFoo в конструктор были переданы все реализации IFoo?

1 Ответ

6 голосов
/ 23 марта 2012

В StructureMap вы можете сделать:

ObjectFactory.Intialize(x => x.Scan(y => y.AddAllTypesOf<IFoo>()));

Это зарегистрирует все типы IFoo

Затем, когда вы решите UsingFoo, они будут введены.

Редактировать:

Я просто быстро написал это в консольном приложении:

ObjectFactory.Initialize(x =>
{
    x.Scan(y =>
    {
        y.AddAllTypesOf<IFoo>();
    });
});

var usingFoo = ObjectFactory.GetInstance<UsingFoo>();

Редактировать:

Вы сами заставили меня сомневаться, поэтому я дважды проверил.

Работает нормально.

Вот рабочий пример, который я быстро написал в консольном приложении:

public interface IFoo
{
    string Text { get; }
}

public class Foo1 : IFoo
{
    public string Text
    {
        get { return "This is from Foo 1"; }
    }
}

public class Foo2 : IFoo
{
    public string Text
    {
        get { return "This is from Foo 2"; }
    }
}

public class Bar
{
    private readonly IEnumerable<IFoo> _myFoos;

    public Bar(IEnumerable<IFoo> myFoos)
    {
        _myFoos = myFoos;
    }

    public void Execute()
    {
        foreach (var myFoo in _myFoos)
        {
            Console.WriteLine(myFoo.Text);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        ObjectFactory.Initialize(x =>
        {
            x.UseDefaultStructureMapConfigFile = false;
            x.Scan(y =>
            {
                y.TheCallingAssembly();
                y.AddAllTypesOf<IFoo>();
            });
        });

        var myBar = ObjectFactory.GetInstance<Bar>();

        myBar.Execute();

        Console.WriteLine("Done");
        Console.ReadKey();
    }
}

Вывод:

Thisот Foo 1

Это от Foo 2

Готово

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...