加载程序集后执行的C#方法

mga*_*mer 5 c# ninject class

我写了一些C#类libary,我想使用Ninject为我的类提供依赖注入.类库是否有可能声明一些代码(方法),这些代码(方法)将在加载类库时每次执行.我需要这个来为Ninject定义绑定.

Jar*_*Par 6

听起来你正在寻找相当于C++的DllMain.在C#中无法做到这一点.

您能否向我们提供有关您的场景的更多信息以及为什么需要在DllMain样式函数中执行代码?

在类型上定义静态构造函数不能解决此问题.静态类型构造函数仅保证在以任何方式使用类型本身之前运行.您可以定义一个静态构造函数,使用Dll中不访问该类型的其他代码,它的构造函数永远不会运行.


Pet*_*yer 1

在过去的 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 内置了这种功能——它实际上具有扫描目录、加载程序集和注册模块的能力。很酷。

如果您的场景与我概述的略有不同,则可能会采用类似的原则。