c# - NuGet包库中的依赖注入(inject)

标签 c# dependency-injection inversion-of-control castle-windsor

这建立在这个问题中讨论的概念的基础上 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/

相关文章:

dependency-injection - 什么是理解 IoC 和 DI 的好类比?

c# - 如何制作类似驱散的效果?

c# - 自定义 WeakReference 实现

java - 根据配置文件中的值注入(inject)依赖项

c# - 如何在 dotnet core 3 中使用依赖项在启动时调用自定义服务?

c# - Ninject with MVC4 - 绑定(bind)bin文件夹中的所有程序集

java - 依赖注入(inject)只针对服务类型对象和单例吗? (而不是图形用户界面?)

asp.net-mvc - DefaultControllerFactory 与 IDependencyResolver

c# - 在应用程序中创建/编译 .net 数据类

C# 如何在 C# 中调用这个 Javascript?