【发布时间】:2018-05-30 11:35:06
【问题描述】:
如您所知,Ninject 将所有接口绑定到组合根中的实现。我们有一个依赖于外部 dll 的类,但如果它没有被使用,我们不想部署它(bin 目录中的物理 dll 文件)。 ExampleClass 类存储在我们的框架项目中,这意味着它被我们正在构建的任何应用程序引用。这就是为什么我们在部署任何应用程序时都会得到以下结果:
无法加载文件或程序集 ExternalDll,版本=x.x.x.xxx, 文化=中立,PublicKeyToken=xxxxxxxxxxxxxxxxx
是否有任何解决方法,例如将实现封装到另一个类或其他东西中?或运行时初始化(工厂模式)。其中哪一个可以解决我的问题?我也尝试过惰性绑定,但没有成功。
使用外部 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();
【问题讨论】:
-
也许我没有明白这一点,但
IUsesExternalDll与UsesExternalDll在同一个程序集中吗?如果是这样,您可以将接口分离到一个公共程序集中。接口程序集始终需要与您的所有应用程序一起部署,但您应该能够省略带有具体类UsesExternalDll的程序集,当然前提是您不尝试引导它。 -
本例中的接口和实现在同一个程序集中。引导它是什么意思?如果我删除 Ninject Binding,它说它无法解决。如果添加了绑定,它还需要 .dll 文件......而对于程序集,您的意思是项目程序集,而不是命名空间,对吗?
-
@StuartLC 一分钟前我读过的很棒的文章:blinkingcaret.com/2016/02/03/…。不幸的是,我们的软件没有被组装分开。我知道这是糟糕的设计......但是没有解决我上述问题的快速解决方案吗?但是仍然有一个地方我将接口绑定到实现,并且正在初始化实现,它将寻找 dll。所以这意味着,dll 必须始终存在?
-
我刚刚构建了一个示例,不,
ExternalDll将始终被拖到最终的应用程序中,即使ExternalDll中的任何类/方法都没有被它实际使用(如果您将接口分成IExternalDll并仅通过接口耦合Framework,那很好)。如果ExternalDll包含敏感代码,您可以尝试创建一个欺骗性的 dll(前提是它没有 strong name),这应该可以安抚 Fusion。但我认为从长远来看,您可能正在寻找一种“插件”模式的方法来管理 DLL。
标签: c# .net dependency-injection inversion-of-control ninject