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

有帮助吗?

解决方案

我用Ninject颇有几分过去的9个月。听起来像是你需要做的是“加载”你的模块存在于你的libray到Ninject内核,以注册绑定的东西。

我不知道,如果你正在使用Ninject的1.x或2.0测试版。这两个版本执行的事情略有不同,但概念上,它们是相同的。我会和1.x版本的讨论贴。另一条我不知道的信息是,如果你的主要程序实例化Ninject内核和你的库只需添加绑定到内核,或者如果你的库本身包含内核和绑定。我假设你需要在你的库中添加绑定到现有Ninject内核的主要组件。最后,我会让你动态加载该库的假设,它不是静态链接到主程序。

做的第一件事是定义在库中注册您的所有绑定一个ninject模块 - 你可能已经做到了这一点,但它是值得一提。例如:

public class MyLibraryModule : StandardModule {
  public override void Load() {
    Bind<IMyService>()
      .To<ServiceImpl>();
    // ... more bindings ...
  }
}

现在您绑定包含一个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));
}

有一点要注意,可以进一步概括上面的代码来加载多个库和注册多种类型。此外,正如我上面提到,Ninject 2具有这种功能内置的 - 它实际上必须扫描目录,加载组件和模块注册的能力。非常凉。

如果您的情况是略有不同的比我所概述的,类似的原理可容易适应。

其他提示

这听起来像你正在寻找的C ++的DllMain中的等同物。有没有办法在C#中做到这一点。

您可以给我们一些有关您的方案,以及为什么需要代码在一个款式的DllMain函数来执行?

上的类型定义的静态构造函数不解决这个问题。静态类型构造时,才能保证自身以任何方式使用的类型之前运行。您可以定义一个静态构造函数,使用不访问类型的DLL中的其他代码,它的构造函数将永远不会运行。

您是否尝试过AppDomain.AssemblyLoad事件?组件已经被加载之后它闪光。

AppDomain.CurrentDomain.AssemblyLoad += (s, e) =>
{
    Assembly justLoaded = e.LoadedAssembly;
    // ... etc.
};

您可以控制客户端代码?如果是的,而不是试图加载装置时,做魔术,我会去实现像登记册,其中不绑定一个类,实现接口IRegistry。然后加载过程中你可以看看IRegistry在你的装配和消防必要方法的实现。

您也可以对你的类属性:

[Component(Implements=typeof(IMyDependency)]

寻找这些属性,并将它们加载到客户端侧的容器中。

或者你可以看看 MEF 这对于这些种情况的库。

据我所知,答案是否定的 。正如我知道你想配置您的IoC容器在你的类库以及如果是这样的情况下,这不是一个好主意,做that.If你在你的类库定义绑定,然后有什么用依赖注入?我们使用依赖注入,这样我们可以注入在运行时的依赖关系,然后我们可以注入在scenarios.Although配置IOC容器的最佳场所不同的不同的对象是启动了您的应用程序(因为一个IoC容器像一个应用骨干:)),但其应被放置在自举,负责启动application.In简单应用中,可以在主方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top