Ninject - 跨程序集的依赖注入

3

我有一个MVC应用程序,引用了六个程序集。每个程序集都有网站的相关组件所依赖的组件。在某些情况下,这些程序集之间还存在相互依赖的情况。

以下是一些原型:

Assembly1
---------
interface ILogger{...}

Assembly2
--------
class MyLogger : ILogger {...}

Assembly3
--------
interface IRepository {.....}

Assembly4
---------
interface MyResository : IRepository
{
 [Inject]
  public ILogger Logger{get;set;}
  ... other methods...
}

MVCApp
------

public HomeController : Controller
{
  [Inject]
   public ILogger Logger{get;set;}
  [Inject]
   public IRepository Repository{get;set;}
}

我已经将所有与Di解析相关的Ninject代码放在一个单独的程序集中,并且该程序集引用了所有其他项目。

这里发生了什么。当HomeController实例化时,我的Logger和Repository属性都有有效的实例。 Logger没有依赖项,非常完美。 但是,当我查看Repository实例时,Logger实例尚未实例化。

您如何在这种情况下使用Ninject设置DI?

谢谢


你如何在Kernel中注册IRepositoryILogger - nemesv
这只是尝试测试的非常基本的方法.. MyKernel.Bind<ILogger>().To<MyLogger>(); MyKernel.Bind<IRepository>().To<MyRepository>() - ByteBlocks
这应该可以工作。检查是否所有属性都在且所有内容都是公共的。另外,您应该进行构造函数注入。 - Remo Gloor
@ByteBlocks 基于纯个人兴趣,我很想看到负责绑定的汇编代码以及它在 UI 层中是如何被引用和调用的。我一直没有搞明白这一点,也没有人能为我解释或演示一个适用于我建立的 NTier 系统的组合根 :-) 我的系统通常有 4 层,有时候甚至有 5 层,并包含许多许多程序集。 - CD Smith
1个回答

1
我通过实现IRepository的提供程序来解决了这个问题。在CreateInstance中,我通过使用Kernel解析Logger属性来实例化它。
CreateInstance(context)
{
  var repo = new MyRepository();
  repo.Logger = context.Kernel.Get<ILogger>();
}

非常好用!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接