mvc5:无法访问已处置的对象。 asp.net mvc5使用unity

时间:2014-01-29 13:57:40

标签: c# asp.net asp.net-mvc dependency-injection unity-container

即时通讯使用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设置为默认值时,它可以正常工作。 我试过很多统一配置,但没有工作...... 非常感谢阅读。

3 个答案:

答案 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<>));

希望这有帮助。

显然有很多与您的应用程序不同,即没有执行方法调用异步,不从模型中读取密码等,但它应该知道如何解决您概述的问题

这个解决方案将为您提供正确的构造函数依赖注入,这将允许您将所有配置放在一个位置(即容器配置),它将为您提供构造函数中的接口,这将使您更容易在单元测试中模拟这些依赖项。

干杯迈克