【问题标题】:Ninject: Abstract Class忍者:抽象类
【发布时间】:2010-05-14 08:21:31
【问题描述】:

我是否需要在抽象类中做一些不同的事情才能让依赖注入与 Ninject 一起工作?

我有一个带有以下代码的基本控制器:

public abstract class BaseController : Controller
{
    public IAccountRepository AccountRepository
    {
        get;
        set;
    }
}

我的模块如下所示:

public class WebDependencyModule : NinjectModule
{
    public override void Load()
    {
        Bind<IAccountRepository>().To<AccountRepository>();
    }
}

这是我的Global.asax

protected override void OnApplicationStarted()
{
    Kernel.Load(new WebDependencyModule());
}

protected override IKernel CreateKernel()
{
    return new StandardKernel();
}

当我用[Inject] 属性装饰IAccountRepository 属性时,它可以工作。

【问题讨论】:

  • 稍微编辑了答案-希望现在总体情况很清楚-如果这没有意义,请随时在 cmets 中跟进。顺便说一句,一定要下载 Ninject 的源代码——它是这个星球上最好的关于 Ninject 答案的地方。测试是一组很好的答案。
  • 啊,这是个好主意。肯定会检查源代码。谢谢!

标签: c# asp.net-mvc ninject ninject-2


【解决方案1】:

不知道你想做什么。

看起来你想做属性注入。如果是这样,你必须坚持属性。

Ninject 不会随意在属性中粘贴东西。

即使可以,从试图理解什么取决于什么的角度来看,你也不会想要它(我已经完全放弃了 PI)。

如果你想进行构造函数注入,具体的 Controller 需要请求一个并将其传递给 'BaseController'。

Ninject 将遍历 Object 并注入 Attributed 属性,但不会以任何特殊方式处理 abstract 类。

要么这样,要么我错过了什么。

【讨论】:

  • 这对我来说有点道理,因为你不喜欢属性注入,你有一些示例代码吗?在我看来你会在某个地方通过 IKernal,这部分我不完全理解,你能解释一下吗?
  • @Haroon:想不出任何好的例子。你看过ninject wiki吗?我是说你只是在任何地方都使用构造函数注入。没有属性注入作为基类获取注入内容的快速方法只能通过以下方式解决:a)删除到服务位置(坏)b)让派生构造函数代表您要求它。基类需要内核的任何地方都不比服务位置好 - 至少 Propety Injection 为您提供了一定程度的间接性。
  • 这就是我的想法,我不喜欢我必须传入内核/容器并让 ctor 解决依赖关系的事实。根据我的喜好,向该课程传递了太多信息。属性注入的唯一问题是您将自己与 Ninject 联系在一起......我看到了一个例子,我可以使用 typeof 这样我没有引用 ninject,只有我的属性......无论哪种方式,这一切看起来都很 hacky对我来说,尤其是因为我使用的是 IOC 容器......
  • 在没有某种程度的与容器耦合的情况下,不能真正进行属性注入 - 无论是按照惯例,按照属性还是通过硬连线,例如Bind&lt;T&gt;....WithProperty( "name", ... ) 但是,是的,正如商定的那样,避免 PI 的原因不止一个!
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多