Как можно использовать авторегистрацию Structuremap в asp.net-mvc?
У меня есть простое приложение MVC, который имеет 3 слоя
- Ui => имеет ссылку на Common And Services
- общий
- Услуги => имеет отношение к общему
Я определяю свои контракты на обслуживание на уровне Common и внедряю их на уровне сервисов
//Common layer
public interface IPersonService
{
void Foo();
}
//Services layer
public classPersonService:IPersonService
{
void Foo()
{
//To DO
}
}
В моем Global.asax я пишу этот код для исходного контейнера Structuremap
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
}
Теперь, в моем контроллере, когда я хочу получить экземпляр от IPersonService, как это
var personService= ObjectFactory.GetInstance<IPersonService>();
Я получаю эту ошибку
Экземпляр по умолчанию не зарегистрирован и не может быть автоматически определен для типа '*.IPersonService'
Есть ли идея для решения этой проблемы?
1 ответ
Вы можете указать другие сборки для сканирования, используя AssembliesFromApplicationBaseDirectory()
функция, вот так:
scan.AssembliesFromApplicationBaseDirectory(a => a.FullName.StartsWith("YourNamespace.Common"));
scan.AssembliesFromApplicationBaseDirectory(a => a.FullName.StartsWith("YourNamespace.Services"));
Поскольку вы пометили этот вопрос как вопрос StructureMap 3, я бы не советовал использовать ObjectFactory
Джереми Миллер (автор StructureMap) дал понять, что он будет удален в будущей версии. На самом деле, вы должны получить предупреждение, что оно будет удалено в следующей версии.
Вместо этого вы должны стремиться настроить свой контейнер следующим образом:
IContainer container = new Container();
container.Configure(c => {
c.IncludeRegistry<YourRegistry>();
});
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
Вы можете прочитать больше о реестрах StructureMap здесь.