【发布时间】:2011-06-14 14:29:06
【问题描述】:
我创建了一个自定义成员资格提供程序,它在其构造函数中采用 IUsersRepository 的实例。
private IUsersRepository usersRepository;
public CustomMembershipProvider(IUsersRepository usersRepository)
{
this.usersRepository = usersRepository;
}
这个依赖是使用 Ninject 绑定的
Bind<IUsersRepository>().To<SqlUsersRepository>().WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString);
Bind<MembershipProvider>().To<CustomMembershipProvider>();
并像这样在我的 AccountController 中使用
CustomMembershipProvider provider;
public AccountController(MembershipProvider membershipProvider)
{
this.provider = (CustomMembershipProvider)membershipProvider;
}
[HttpPost]
public ActionResult Register(User user)
{
MembershipCreateStatus status = new MembershipCreateStatus();
provider.CreateUser(user.FirstName, user.LastName, user.Email, user.Password, out status);
return View(user);
}
这样做的问题是,当 CustomMembershipProvider 被实例化时,Initialize 方法没有被调用,因此我修改过的 Web.Config 没有被读取。
另一方面,我注意到 CustomMembershipProvider 被实例化了两次——第一次是我上面解释的,然后是当我的 [HttpPost] 操作方法被调用时。第二次使用无参数构造函数实例化它并调用 Initialize 方法。我不知道第二个 CustomMembershipProvider 会发生什么,因为 provider.CreateUser() 使用了我未初始化的 CustomMembershipProvider。
我希望我已经解释得足够好,任何帮助将不胜感激。
【问题讨论】:
-
感谢您的评论,但如果我太天真,请原谅我 - 因为我没有使用 Windsor,所以我看不出这些链接如何帮助解决我的问题。
-
几乎没有任何区别,相同的概念适用于 Ninject 或任何其他 IoC 容器,甚至很多代码。
-
@Mauricio 老实说,我真的不明白该怎么做 - 似乎有很多代码和乱七八糟的东西来解决这个问题。我很想删除 IUsersRepository 和 MembershipProvider 之间的依赖关系,并将我的存储库代码放在提供程序中,因为这是我将使用它的唯一地方。我确实意识到这会使测试变得困难。
标签: c# unit-testing asp.net-mvc-2 dependency-injection ninject