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

时间:2018-05-30 11:35:07

标签: c# .net dependency-injection inversion-of-control ninject

如您所知,Ninject将所有接口绑定到组合根中的实现。我们有一个依赖于外部dll的类,但是如果没有使用它我们不想部署它(bin目录中的物理dll文件)。类ExampleClass存储在我们的Framework项目中,这意味着它正由我们正在构建的任何应用程序引用。这就是我们在部署任何应用程序时获得以下内容的原因:

  

无法加载文件或程序集ExternalDll,Version = x.x.x.xxx,   Culture = neutral,PublicKeyToken = xxxxxxxxxxxxxxxx

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

构造函数注入正在使用外部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();

2 个答案:

答案 0 :(得分:0)

您可以使用约定绑定替换绑定:

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

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

答案 1 :(得分:0)

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

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未实例化。