我有 ASP.NET MVC3 项目,我想在其中使用自定义成员资格提供程序。我还想使用 Unity 来解决我的依赖注入问题。
这是来自 Global.asax 的代码:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var container = new UnityContainer();
container.RegisterType<IAuthentification, Authentification>();
container.RegisterType<IRepository, Repository>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
这是我的会员提供商的代码:
public class CustomMembershipProvider : MembershipProvider
{
[Dependency]
private IProveaRepository Repository { get; set; }
public override bool ValidateUser(string username, string password)
{
.....
}
问题是当我在 ValidateUser 方法中设置断点时,我看到 Repository 属性未初始化。但是这个构造:
[Dependency]
private IProveaRepository Repository { get; set; }
例如,在控制器中工作得很好。
有谁知道为什么会这样以及该怎么办?
过去几天我遇到了同样的问题。我最终得到了以下解决方案(类型和字段名称更改为与您的匹配)。
public class CustomMembershipProvider : MembershipProvider
{
private IProveaRepository repository;
public CustomMembershipProvider()
: this (DependencyResolver.Current.GetService<IProveaRepository>())
{ }
public CustomMembershipProvider(IProveaRepository repository)
{
this.repository= repository;
}
public override bool ValidateUser(string username, string password)
{
...
}
}
因此,尽管 Unity 无法控制构建CustomMembershipProvider
,无参数构造函数让 Unity 参与(通过 MVC3DependencyResolver
)以提供正确的存储库实例。
如果您正在单元测试CustomMembershipProvider
那么你可以直接使用Unity构建一个实例,它将使用第二个构造函数并避免调用DependencyResolver
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)