asp.net-mvc - 使用 Ninject 将存储库注入(inject)自定义成员提供程序

标签 asp.net-mvc asp.net-mvc-3 ninject-2

我正在尝试使用 MVC 3 中的 ninject 将存储库注入(inject)自定义成员资格提供程序。

在 MembershipProvider 我尝试了以下方法:

[Inject]
public ICustomerRepository _customerRepository{ get; set; }


[Inject]
public TUMembershipProvider(ICustomerRepository customerRepository)
{
    _customerRepository = customerRepository;
}

在我的 ninject 模块中,我尝试了以下操作:
Bind<MembershipProvider>().ToConstant(Membership.Provider);

以上都不起作用。

当我使用(在 global.asa 中)
kernel.Inject(Membership.Provider);

和...一起
[Inject]
public ICustomerRepository _customerRepository{ get; set; }

它可以工作,但我没有生命周期管理,这将导致 NHibernate 出现“ISession 已打开”错误,因为 ISession 是 InRequestScope 而存储库不是。

最佳答案

您可以使用 @Remo Gloor outlines in his blog post on provider injection 的方法.它涉及3个步骤:

  • 添加 [Inject] s 到您需要注入(inject)的提供程序上的任何属性(尽管他展示的模式 - 创建一个非常简单的类,其唯一功能是接受属性注入(inject)并将任何请求转发到使用构造函数注入(inject)实现的真实类 - 很好值得关注)
    public class MyMembershipProvider : SqlMembershipProvider
    {
        [Inject]
        public SpecialUserProvider SpecialUserProvider { get;set;}
        ...
    
  • 创建一个实现 IHttpModule 的初始化程序包装器它将提供者拉进来,触发它的创建:-
    public class ProviderInitializationHttpModule : IHttpModule
    {
        public ProviderInitializationHttpModule(MembershipProvider membershipProvider)
        {
        }
    ...
    
  • 注册IHttpModule在您的 RegisterServices :-
    kernel.Bind<IHttpModule>().To<ProviderInitializationHttpModule>();
    
  • 没有4; Ninject 完成其余工作 - 引导所有已注册的 IHttpModules包括您添加的那个)在启动序列期间。

  • (不要忘记阅读博客文章重新生命周期等的评论。)

    最后,如果您正在寻找可以巧妙解决问题的完全无脑直接的方法,请尝试 this @Remo Gloor answer instead

    PS 一篇关于整个困惑的精彩文章是 Provider is not a Pattern by @Mark Seemann . (以及他的优秀著作的必修插件:- Dependency injection in .NET 这将使您从第一原理中轻松地弄清楚这些东西)

    关于asp.net-mvc - 使用 Ninject 将存储库注入(inject)自定义成员提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596441/

    相关文章:

    asp.net-mvc-3 - 下载ISO文件

    asp.net-mvc - Ninject 2.2 多重绑定(bind)

    c# - Parallel.Foreach 中的 Ninject 异常

    asp.net-mvc-3 - 具有无参数构造函数的 Ninject 和 Provider 模型

    c# - 如何更新 Controller 中的 .ToList() 以指向不同的表?

    javascript - 使用日期时间选择器进行日期和时间验证 (ASP.Net MVC Core v1.1)

    c# - ASP.NET MVC : No IUserTokenProvider is registered using Ninject

    c# - 如何处理 ASP.NET MVC5 应用程序中的请求超时?

    .NET MVC 3 C# 访问单个列表 <model> 项

    c# - 无法检查数组是否为空