我写了一些C#类libary,我想使用Ninject为我的类提供依赖注入.类库是否有可能声明一些代码(方法),这些代码(方法)将在加载类库时每次执行.我需要这个来为Ninject定义绑定.
听起来你正在寻找相当于C++的DllMain.在C#中无法做到这一点.
您能否向我们提供有关您的场景的更多信息以及为什么需要在DllMain样式函数中执行代码?
在类型上定义静态构造函数不能解决此问题.静态类型构造函数仅保证在以任何方式使用类型本身之前运行.您可以定义一个静态构造函数,使用Dll中不访问该类型的其他代码,它的构造函数永远不会运行.
在过去的 9 个月里,我经常使用 Ninject。听起来您需要做的是将库中存在的模块“加载”到 Ninject 内核中,以便注册绑定。
我不确定您使用的是 Ninject 1.x 还是 2.0 beta。这两个版本的执行方式略有不同,但在概念上它们是相同的。在本次讨论中我将坚持使用 1.x 版本。我不知道的另一条信息是,您的主程序是否正在实例化 Ninject 内核,而您的库只是将绑定添加到该内核,或者您的库本身是否包含内核和绑定。我假设您需要将库中的绑定添加到主程序集中现有的 Ninject 内核。最后,我将假设您正在动态加载该库并且它不是静态链接到主程序。
要做的第一件事是在库中定义一个 ninject 模块,在其中注册所有绑定 - 您可能已经这样做了,但值得一提。例如:
public class MyLibraryModule : StandardModule {
public override void Load() {
Bind<IMyService>()
.To<ServiceImpl>();
// ... more bindings ...
}
}
Run Code Online (Sandbox Code Playgroud)
现在您的绑定包含在 Ninject 模块中,您可以在加载程序集时轻松注册它们。这个想法是,一旦加载程序集,您就可以扫描它以查找从 StandardModule 派生的所有类型。一旦获得这些类型,就可以将它们加载到内核中。
// Somewhere, you define the kernel...
var kernel = new StandardKernel();
// ... then elsewhere, load your library and load the modules in it ...
var myLib = Assembly.Load("MyLibrary");
var stdModuleTypes = myLib
.GetExportedTypes()
.Where(t => typeof(StandardModule).IsAssignableFrom(t));
foreach (Type type in stdModuleTypes) {
kernel.Load((StandardModule)Activator.CreateInstance(type));
}
Run Code Online (Sandbox Code Playgroud)
需要注意的一件事是,您可以进一步概括上述代码以加载多个库并注册多个类型。另外,正如我上面提到的,Ninject 2 内置了这种功能——它实际上具有扫描目录、加载程序集和注册模块的能力。很酷。
如果您的场景与我概述的略有不同,则可能会采用类似的原则。