【问题标题】:Ninject and Provider Model with Parameterless Constructor具有无参数构造函数的 Ninject 和 Provider 模型
【发布时间】:2011-05-01 18:38:01
【问题描述】:

我正在实现一个自定义 RoleProvider 并想使用 Ninject 但是我面临一个无参数构造函数问题。关于如何为此注入的任何想法?

public class EFRoleProvider:RoleProvider
{
    private readonly IRepository _repository;

    // I want to INJECT this GOO here!
    public EFRoleProvider()
    {
        IContextFactory contextFactory = new DbContextFactory<myEntities>();
        _repository = new RepositoryBase(contextFactory);

    }
}

【问题讨论】:

  • 您可能对这篇文章感兴趣:blog.ploeh.dk/2011/04/27/ProviderIsNotAPattern.aspx
  • 伟大的帖子,所以基本上我应该滚动我自己的接口和实现,并从 web.config 中清除提供者 XML,因为提供者的东西有点蹩脚。好的,回到绘图板 LOL

标签: asp.net-mvc-3 c#-4.0 dependency-injection ninject-2


【解决方案1】:

您不能注入硬编码的内容。对不起。没有 DI 框架支持这一点。在您的构造函数中,您已经对实例进行了硬编码,因此这不再是控制反转。为了执行控制反转,您需要将层定义为尽可能松散耦合:

public class EFRoleProvider: RoleProvider
{
    private readonly IContextFactory _contextFactory;
    public EFRoleProvider(IContextFactory contextFactory)
    {
        _contextFactory = contextFactory;
    }
}

现在继续配置您的 DI 框架。

【讨论】:

  • 从 RoleProvider 派生时,您必须有一个无参数的 ctor。这就是我遇到问题的地方。配置我的 DI 不是问题 :) 参数化构造函数永远不会被调用。
  • @Assistant 到助手,是的,RoleProvider 是一个遗留的 ASP.NET 类,它需要一个无参数的构造函数,并且 AFAIK 没有允许您控制它的创建的钩子。作为替代方案,您可以从默认构造函数中的 StandardKernel 获取依赖项。
  • 是的,我正在研究如何使用 Ninject 做到这一点
  • @Assistant 到助手,在构造函数中:_repository = new StandardKernel().Get&lt;IRepository&gt;();.
  • 这并没有按预期工作:解析器错误消息:调用目标已引发异常。这几乎就像我的 Ninject 模块(在其他任何地方都可以很好地工作)被加载到这个 RoleProvider ctor 看不到的地方。
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多