即时通讯使用vs 2013,mvc5和ef6 + unity.mvc5: 我的帐户控制器类有这个构造函数:
public AccountController(UserManager<ApplicationUser> userManager)
{
this.UserManager = userManager;
}
这是我的统一配置:
container.RegisterType(typeof(AccountController),
new InjectionConstructor(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>())));
当我尝试注册新用户时,我得到了这个例外:
Cannot access a disposed object.
Object name: 'UserManager`1'.
在这行代码和注册操作上:
var result = await UserManager.CreateAsync(user, model.Password);
当我删除unity并将dependecy resolver设置为默认值时,它可以正常工作。 我试过很多统一配置,但没有工作...... 非常感谢阅读。
答案 0 :(得分:4)
不要创建一个无参数的构造函数,(因为我没有足够的信誉,我不能将其投票),这个答案完全避免了IoC,而是通过了解对象的整个依赖关系层次来尝试构建对象,即AccountController需要知道它对UserStore有依赖性,并且需要知道Userstore对UserContext有依赖性。这正是DI容器所要避免的!
很难为您提供准确的答案,因为您的代码很多都缺失了。
对我来说有点奇怪的是你有一个大写UserManger
,这通常意味着你将它用作一个类型,而不是引用一个本地私有变量。你能告诉我剩下的代码吗?
另外,我会问你为什么不通过接口引用所有内容。到目前为止,这是建立适当DI的首选方式。
我会尝试敲一些显示我会做什么的测试代码,然后在这里发布,如果你能在此期间回答这些问题那将是很棒的。
干杯迈克
答案 1 :(得分:3)
我找到了解决方案,将unity配置更改为:
container.RegisterType<IUserStore<ApplicationUser>,
UserStore<ApplicationUser>>(new InjectionConstructor(new ApplicationDbContext()));
谢谢大家。
答案 2 :(得分:1)
这就是我要做的事。
在您的控制器中
public class HomeController : Controller
{
private IUserManager<ApplicationUser> userManager;
public HomeController(IUserManager<ApplicationUser> userManager)
{
this.userManager = userManager;
}
public ActionResult Index()
{
var user = "user";
var password = "password";
var result = userManager.CreateAsync(user, password);
return View();
}
}
UserManager的界面
public interface IUserManager<T> where T : ApplicationUser
{
int CreateAsync(string user, string password);
}
实际UserManager类
public class UserManager<T> : IUserManager<T> where T : ApplicationUser
{
private IUserStore<ApplicationUser> userStore;
public UserManager(IUserStore<ApplicationUser> userStore)
{
this.userStore = userStore;
}
public int CreateAsync(string user, string password)
{
return 0;
}
}
UserStore的接口
public interface IUserStore<T> where T : ApplicationUser
{
}
实际用户商店
public class UserStore<T> : IUserStore<T> where T : ApplicationUser
{
}
Unity配置
container.RegisterType(typeof (IUserManager<>), typeof (UserManager<>));
container.RegisterType(typeof (IUserStore<>), typeof (UserStore<>));
希望这有帮助。
显然有很多与您的应用程序不同,即没有执行方法调用异步,不从模型中读取密码等,但它应该知道如何解决您概述的问题
这个解决方案将为您提供正确的构造函数依赖注入,这将允许您将所有配置放在一个位置(即容器配置),它将为您提供构造函数中的接口,这将使您更容易在单元测试中模拟这些依赖项。
干杯迈克