Стоит ли пытаться скрыть контейнер IoC (если да, то какие советы)? - PullRequest
1 голос
/ 29 августа 2011

Я создаю CMS, и она имеет много точек расширения (Data / ContentTypes, Plugins, Macros, Themes), и некоторые из этих расширений должны регистрировать сервисы. Пока что расширения зависят только от библиотеки «MyProject.Core», и было бы хорошо, если бы они не зависели от какой-либо конкретной платформы IoC. Теперь я думаю, стоит ли мне создавать еще один слой, чтобы скрыть определенные регистрации IoC. Проблема в том, что мне нужны дополнительные функции.

например. NHibernate реализация сервисов Data / ContentType (стиль Виндзорский замок)

container.Register(Component.For<IPageRepository>().ImplementedBy<NHPageRepository>());
container.Register(Component.For<ISessionFactory>().Instance(NHibernateHelper.CreateSessionFactory()));
container.Register(Component.For<ISession>().UsingFactoryMethod(c => c.Resolve<ISessionFactory>().OpenSession()).LifeStyle.PerWebRequest);

Третья строка - "жесткая". Я мог бы сделать интерфейс как

interface IMyContainer
{
    Register<TService>(Func<IMyContainer,TService> factoryMethod)
    Register<TService>(Func<IMyContainer,TService> factoryMethod, LifeStyle lifeStyle)
    // ...
}

но "перевод" этой регистрации (моя абстракция IoC)

public class NHInstaller :  IInstaller
{
    public void Install(IMyContainer container)
    {
        container.Register<ISession>(c => c.Resolve<ISessionFactory>().OpenSession(), LifeStyle.PerRequest);
    }
}

к этому (Виндзор)

container.Register(Component.For<ISession>().UsingFactoryMethod(c => c.Resolve<ISessionFactory>().OpenSession()).LifeStyle.PerWebRequest);

может быть довольно сложно.

Итак, я должен попытаться сделать эту абстракцию? Любые полезные ресурсы? Или мне просто взять контейнер IoC и придерживаться его?

Я мог бы также сделать исходный код существующего инструмента (Castle Windsor или Ninject) частью моей библиотеки, но я не совсем понимаю эти лицензии. Могу ли я сделать это? Могу ли я изменить пространства имен и имена классов в соответствии со структурой моего приложения? Я собираюсь выпустить исходный код, и мне все равно, какой будет лицензия.

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Это зависит от того, что вы подразумеваете под «скрыть». Рекомендуется, чтобы только одно место в вашем приложении ( Composition Root ) знало о контейнере IoC. Придерживайтесь Голливудского принципа - избегайте использования нескольких классов, которые знают о контейнере IoC. Другими словами, не передавайте контейнер; если некорневому классу нужно создавать другие объекты, тогда добавьте в него фабрику.

Если вы пишете фреймворк и хотите разрешить потребителям подключать свою инфраструктуру контейнера IoC по вашему выбору, вы можете использовать библиотеку Common Service Locator . Это, вероятно, излишне для большинства проектов. (См. Отличная ссылка Марка Симанна по той причине, что я изменил формулировку).

1 голос
/ 29 августа 2011

Короткий ответ - нет, абстракция бесполезна, вы бы тратили деньги своего работодателя.Вместо этого используйте Installers , чтобы разделить регистрацию.

...