构造函数注入的实现具有未使用的 dll 依赖项

Constructor injected implementation has a dll dependency which is not used

如您所知,Ninject 将所有接口绑定到组合根中的实现。我们有一个 class 依赖于外部 dll,但如果它没有被使用,我们不想部署它(bin 目录中的物理 dll 文件)。 class ExampleClass 存储在我们的框架项目中,这意味着我们正在构建的任何应用程序都会引用它。这就是为什么我们在部署任何应用程序时都会收到以下信息:

Could not load file or assembly ExternalDll, Version=x.x.x.xxx, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx

是否有任何解决方法,比如将实现封装到另一个 class 中之类的?或运行时初始化(工厂模式)。其中哪一个可以解决我的问题?我也尝试过 Lazy binding 但没有成功。

正在使用外部 dll 的实现的构造函数注入

namespace Framework
{
    public class ExampleClass
    {
        private readonly IUsesExternalDll _usesExternalDll;

        public ExampleClass(IUsesExternalDll usesExternalDll)
        {
            _usesExternalDll = usesExternalDll;
        }
    }
}

界面

public interface IUsesExternalDll
{

}

实施

using externalDll; //this using is a reference to external dll

public class UsesExternalDll : IUsesExternalDll
{

}

绑定

kernel.Bind<IUsesExternalDll>().To<UsesExternalDll>().InTransientScope();

您可以将您的绑定替换为约定绑定:

kernel.Bind(x => x.FromAssembliesMatching("AssemblyWhereUsesExternalDllIsLocated.dll")
    .SelectAllClasses()
    .BindAllInterfaces()
    .Configure(c => c.InTransientScope()));

现在仅当找到此程序集时才会绑定内部类型。

我是如何解决这个问题的:

1) 将 Ninject 绑定移动到使用它的特定应用程序(更高级别)。

2) 使构造函数注入参数Optional.

namespace Framework
{
    public class ExampleClass
    {
        private readonly IUsesExternalDll _usesExternalDll;

        public ExampleClass([Optional] IUsesExternalDll usesExternalDll)
        {
            _usesExternalDll = usesExternalDll;
        }
    }
}

可选属性将导致仅在存在绑定时才被实例化。由于我将绑定移动到使用它的特定应用程序,因此在所有其他应用程序中我不会收到 Could not load file or assembly 错误,因为 UsesExternalDll 未实例化。