структура карты asp .net регистрация mvc - PullRequest
1 голос
/ 23 февраля 2012

Я использую структурную карту и Asp .Net MVC в проекте. В настоящее время я регистрирую свои разрешения зависимостей в слое MVC для всего, что находится ниже (сервис, данные и т. Д.). Однако мне было интересно, как я могу сделать это, регистрируя только то, что находится непосредственно под уровнем MVC, а именно, уровень сервиса. По сути, в мои контроллеры встроены сервисы, и это все, что я хочу, чтобы мой уровень пользовательского интерфейса знал. Внутри классов обслуживания у меня есть встроенные репозитории, и я хочу, чтобы те, которые были зарегистрированы с Structuremap там ... и так далее. Другими словами, я хочу, чтобы каждый слой был зависим (насколько это возможно) только от слоя, расположенного непосредственно под ним. Спасибо!

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

Я рекомендую использовать составной корень в собственной библиотеке.

В проекте, над которым я работаю, мы помещаем реестр StructureMap в библиотеку с именем xx.yy.IoC и вызываем код конфигурации из Global.asax.

Уровень MVC имеет только ссылку на библиотеку IoC. Библиотека IoC имеет зависимости от других уровней (домен, данные и т. Д.)

Как подсказка: эта статья изменила наши взгляды на слоистость. луковичная архитектура Джеффри Палермо

1 голос
/ 23 февраля 2012

Хорошим подходом является использование соглашений структурной карты в сочетании с регистрами структурной карты.Это позаботится о большинстве ваших проблем с регистрацией.Structuremap может сканировать ваши bin и map зависимости, которые он находит во всех dll в вашем bin.

Просмотр метода Scan в сочетании с классом RegistryMap Registry:

Scan(x =>
{
    x.AssembliesFromApplicationBaseDirectory(y =>
        y.FullName.StartsWith("JustLookAtTheseDlls"));

    // Use default conventions
    x.WithDefaultConventions().OnAddedPluginTypes(y =>
        y.HybridHttpOrThreadLocalScoped()); 

    //Are there any registries?  If so, register them
    x.LookForRegistries();  
}

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

public class IocRegistry :
    StructureMap.Configuration.DSL.Registry
{
    public IocRegistry()
    {
        For<IDocumentStore>().Singleton()
            .Use<RavenStore>();
    }
}

В вашем корневом приложении должен быть реестр, содержащий приведенный выше оператор сканирования.Затем инициализируйте структурную карту следующим образом:

ObjectFactory.Configure(x => x.AddRegistry(
    new MyTopLevelRegistry()));

Где MyTopLevelRegistry выглядит следующим образом:

public class MyTopLevelRegistry: Registry
{
    public MyTopLevelRegistry()
    {
        Scan(x =>
        {
            x.AssembliesFromApplicationBaseDirectory(
                y => y.FullName
                .StartsWith("InsertYourNamespacePrefix"));

            x.WithDefaultConventions().OnAddedPluginTypes(
                y => y.HybridHttpOrThreadLocalScoped());

            x.LookForRegistries();
        });
    }
}

Имейте в виду, если вы установите для него значение «WithDefaultConventions», оно автоматически сопоставит IMyClass с MyClass, чтобы вы моглидаже не нужно указывать этот материал в реестрах.Вам просто нужно зарегистрировать предметы, которые не соответствуют этому соглашению.

Надеюсь, это поможет!

1 голос
/ 23 февраля 2012

Я не уверен, что понимаю, о чем вы спрашиваете.

Вы должны зарегистрировать все объекты, которые будут решены. Тогда в вашем контроллере вы просто ожидаете, что ISomeService будет передан в конструктор. Контроллер не знает, например, что ISomeService внедрил IRepositories.

...