我正在尝试使用 MVC 3 中的 ninject 将存储库注入到自定义成员资格提供程序中。
在 MembershipProvider 中我尝试了以下操作:
[Inject]
public ICustomerRepository _customerRepository{ get; set; }
And
[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 is open”错误,因为 ISession 是 InRequestScope 而存储库不是。
你可以使用该方法@Remo Gloor 在他的博客文章中概述了提供者注入 http://www.planetgeek.ch/2012/02/08/asp-net-provider-injection-with-ninject-3-0-0/。它涉及 3 个步骤:
-
Add [Inject]
s 到您需要注入的提供程序上的任何属性(尽管他展示的模式 - 创建一个非常简单的类,其唯一功能是接受属性注入并将任何请求转发到使用构造函数注入实现的真实类 - 很好值得关注)
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
包括您在启动序列期间添加的那个)。
(不要忘记阅读关于生命周期等博客文章的评论。)
最后,如果你正在寻找一些完全脑死亡的东西来巧妙地解决它,请尝试这个@Remo Gloor 的答案 https://stackoverflow.com/a/9314754/11635
PS,关于整个混乱的一篇很棒的文章是提供者不是@Mark Seemann 的模式 http://blog.ploeh.dk/2011/04/27/ProviderIsNotAPattern.aspx。 (以及他的优秀著作的必备插件:-.NET 中的依赖注入 http://manning.com/seemann这会让你从第一原理中轻松地弄清楚这些东西)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)