构造函数注入的实现具有未使用的 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
未实例化。
如您所知,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
未实例化。