Контейнер StructureMap с параметрами конструктора - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть класс, RepositoryManager, и я использую этот класс в некоторых моих контроллерах:

public RepositoryManager
{
    public IGenericRepository Repository {get; set;}

    public RepositoryManager()
    {
        Repository = new GenericRepository(new MyEntities());
    }

    //...
}

Я хочу переместить IGenericRepository в StructureMap Инверсия элемента управления (IoC), контейнер

x.For<IGenericRepository>().Use<GenericRepository>().Ctor<MyEntities>("MyEntities");

Затем я изменяю свой конструктор класса следующим образом:

public RepositoryManager(IGenericRepository repository)
{
    Repository = repository;
}

Но инъекция не сработала. Я также пытался использовать атрибут [SetterProperty] в репозитории, но репозиторий все еще не создавался.

Что я сделал не так?

Моя полная инициализация IoC:

public static class IoC {
    public static IContainer Initialize() {
        ObjectFactory.Initialize(x =>
            {
                x.Scan(scan =>
                    {
                        scan.TheCallingAssembly();
                        scan.WithDefaultConventions();
                    });
                x.For<IRepositoryManager>().Use<RepositoryManager>();
                x.For<IGenericRepository>().Use<GenericRepository>().Ctor<MyEntities>("MyEntities");
            });
        return ObjectFactory.Container;
    }
}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2011

Вам не нужно регистрировать конкретные типы; они будут просто решены StructureMap. Сканер уже используется с соглашениями по умолчанию, поэтому для приведенного выше примера вполне достаточно следующего регистрационного кода:

    ObjectFactory.Initialize(x => x.Scan(scanner =>
    {
        scanner.TheCallingAssembly();
        scanner.WithDefaultConventions();
    }));
0 голосов
/ 10 сентября 2011

Обычно ваша инициализация IoC неверна для IGenericRepository. Измените его на:

x.For<IGenericRepository>().Use(() => new GenericRepository(new MyEntities()));

В таком случае будет вызван конструктор с параметром MyEntities, а экземпляр MyEntities будет создан и передан этому конструктору в качестве параметра.

...