1

Я использую StructureMap.MVC5 и имеют следующие проекты и классы:StructureMap с MVC и несколькими слоями

Web 
    HomeController(PageService pageService) 
Services 
    PageService(IPageRepository pageRepository) 
Repositories 
    PageRepository : IPageRepository 
IRepositories 
    IPageRepository 

С реализацией по умолчанию StructureMap.MVC5 автоматически устраняет PageService в мою HomeController, но не PageRepository в мой PageService. Это дает мне исключение: No parameterless constructor defined for this object.

Это решается путем добавления строки в DefaultRegistry:

For<IPageRepository>().Use<PageRepository>(); 

Но, очевидно, я предпочел бы StructureMap автоматически решить эту проблему. Есть ли способ достичь этого?

Это то, что DefaultRegistry выглядит следующим образом:

public DefaultRegistry() 
{ 
    Scan(scan => 
    { 
     scan.TheCallingAssembly(); 
     scan.WithDefaultConventions(); 
     scan.With(new ControllerConvention()); 
    }); 
} 

ответ

1

Причина ваше хранилище не решается автоматически, потому что это в другой сборке, где, как ваш сервис ссылочного в контроллере, то есть он получает разрешенным вызовом TheCallingAssembly.

Рассказывать StructureMap, чтобы загрузить свои хранилища, вы должны явно указать, какие сборки для сканирования:

scan.AssemblyContainingType<IPageRepository>(); 

типа данные не должен быть IPageRepository типа, просто каким-то типа в вашем хранилище сборки так StructureMap знает, где искать.

Теперь любые типы в сборке репозитория должны быть разрешены автоматически.

Смежные вопросы