Как можно использовать авторегистрацию Structuremap в asp.net-mvc?

У меня есть простое приложение MVC, который имеет 3 слоя

  1. Ui => имеет ссылку на Common And Services
  2. общий
  3. Услуги => имеет отношение к общему

Я определяю свои контракты на обслуживание на уровне 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 здесь.

Другие вопросы по тегам