这建立在这个问题中讨论的概念的基础上 How to manage Castle Windsor dependencies in a nuget library .
我正在开发一个项目,该项目使用 CaSTLe.Windsor 进行 DI 并引用多个自定义 NuGet 包。我已在通过 NuGet 引用的类库之一(我们称之为 MyNugetLib)中安装了 CaSTLe.Windsor,并且我已在该库中的 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 容器引用从 MyProj 传递给 MyNugetLib?我尝试在需要的类的构造函数中注入(inject) IWindsorContainer,但该类使用延迟实例化,如下所示:
private static readonly Lazy<MyClass> LazyInstance = new Lazy<MyClass>(() => new MyClass());
private MyClass() {}
public static MyClass Instance => LazyInstance.Value;
从 MyProj 调用如下:
Lib.MyClass.Instance
我成功完成这项工作的唯一方法是在 MyClass 中公开一个公共(public)属性,该属性在 MyProj 中用于设置 WindsorContainer
public IWindsorContainer DIContainer { get; set; }
在我的项目中
Lib.MyClass.DIContainer = MyProj.WindsorContainer
我不是特别喜欢这个。有更好的方法吗?
更新:(感谢insane_developer的建议)
问题实际上是:如何在惰性构造函数中注入(inject)依赖项?如果我能做到这一点,那么我就可以从 MyNugetLib 中删除对 Windsor 的依赖。
所以我会
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(???));
如何编写上面的 func 以便它在我的构造函数中注入(inject)依赖项?
最佳答案
我从未使用过 CaSTLe.Windsor,但我认为它会像其他容器一样。您实际上并不需要将对容器的引用传递给您的库。您应该能够在主应用程序中配置所有映射,该应用程序引用了您的库。如果您按照您的建议操作,您将对 CaSTLe.Windsor 产生具体依赖,这不是一个好主意。
关于c# - NuGet包库中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63266523/