如您所知,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();
答案 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
未实例化。