Это основано на концепциях, обсуждаемых в этом вопросе Как управлять зависимостями Castle Windsor в библиотеке nuget .
Я работаю над проектом, который использует Castle.Windsor для DI и ссылается на несколько пользовательские пакеты NuGet. Я установил Castle.Windsor в одну из библиотек классов (назовем ее MyNugetLib), на которую ссылается NuGet, и я определил метод расширения в IWindsorContainer в этой библиотеке, который регистрирует локальные службы.
public static class WindsorContainerExtensions
{
public static void RegisterMyNugetLibServices(this IWindsorContainer container)
{
container.RegisterLocalServices();
}
private static void RegisterLocalServices(this IWindsorContainer container)
{
container.Register(...)
}
}
проект, который ссылается на этот пакет NuGet (назовем его MyProj), также использует Windsor и в установщике вызывает метод расширения, определенный в пакете NuGet. Все это работает. Мой вопрос: как передать ссылку на контейнер Windsor в MyNugetLib из MyProj? Я пробовал внедрить IWindsorContainer в конструктор класса, где он мне нужен, но этот класс использует ленивую инстанциацию следующим образом:
private static readonly Lazy<MyClass> LazyInstance = new Lazy<MyClass>(() => new MyClass());
private MyClass() {}
public static MyClass Instance => LazyInstance.Value;
Из MyProj это вызывается следующим образом:
Lib.MyClass.Instance
Единственный способ, которым мне удалось выполнить эту работу, - это раскрыть свойство publi c в MyClass, которое используется в MyProj для установки WindsorContainer
public IWindsorContainer DIContainer { get; set; }
в MyProj
Lib.MyClass.DIContainer = MyProj.WindsorContainer
Мне это не особенно нравится. Есть ли лучший способ сделать это?
Обновление: (благодаря предложениям insane_developer)
На самом деле вопрос заключается в следующем: как внедрить зависимости в ленивый конструктор? Если бы я мог это сделать, то я мог бы удалить зависимость от Windsor из MyNugetLib.
Так что у меня было бы
private IService1 service1;
private IService2 service2;
private MyClass(IService1 myService1, IService2 myService2)
{
this.service1 = myService1;
this.service2 = myService2
}
public static MyClass Instance => LazyInstance.Value;
private static readonly Lazy<MyClass> LazyInstance = new Lazy<MyClass>(() => new MyClass(???));
Как мне написать забаву c выше, чтобы он вводил зависимости в моем конструкторе?