Я создаю 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) частью моей библиотеки, но я не совсем понимаю эти лицензии. Могу ли я сделать это? Могу ли я изменить пространства имен и имена классов в соответствии со структурой моего приложения? Я собираюсь выпустить исходный код, и мне все равно, какой будет лицензия.