C# mvc5:无法访问已释放的对象。使用unity的asp.net mvc5

C# mvc5:无法访问已释放的对象。使用unity的asp.net mvc5,c#,asp.net,asp.net-mvc,dependency-injection,unity-container,C#,Asp.net,Asp.net Mvc,Dependency Injection,Unity Container,im使用vs 2013、mvc5和ef6+unity.mvc5: 我的帐户控制器类具有以下构造函数: public AccountController(UserManager<ApplicationUser> userManager) { this.UserManager = userManager; } 在这一行代码和注册操作中: var result = await UserManager.CreateAsync(user, model.Pass

im使用vs 2013、mvc5和ef6+unity.mvc5: 我的帐户控制器类具有以下构造函数:

public AccountController(UserManager<ApplicationUser> userManager)
    {
        this.UserManager = userManager;
    }
在这一行代码和注册操作中:

var result = await UserManager.CreateAsync(user, model.Password);
当我删除unity并将Dependency解析器设置为默认值时,它工作得很好。 我试了很多次,但都没用。。。
非常感谢阅读。

不要创建无参数构造函数(我不能否决它,因为我没有足够的声誉),这个答案完全避免了IoC,而是试图通过了解对象的整个依赖层次结构来构建对象,也就是说,AccountController需要知道它对UserStore有依赖关系,并且需要知道UserStore对UserContext有依赖关系。这正是DI容器要避免的

很难为您提供准确的答案,因为您的代码有很多缺失

我觉得奇怪的一点是,您有一个大写的
UserManger
,这通常意味着您将其用作一个类型,而不是引用局部私有变量。你能告诉我剩下的代码吗

此外,我还想问,为什么不通过接口引用所有内容。到目前为止,这是建立适当DI的首选方法

我将尝试编写一些测试代码,展示我将要做的事情,然后在这里发布这篇文章,如果您能同时回答这些问题,那将非常好


干杯,迈克这是我要做的

在控制器中

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();
    }
}
公共类HomeController:控制器
{
私人IUserManager用户管理器;
公共家庭控制器(IUserManager用户管理器)
{
this.userManager=userManager;
}
公共行动结果索引()
{
var user=“user”;
var password=“password”;
var result=userManager.CreateAsync(用户,密码);
返回视图();
}
}
UserManager的接口

public interface IUserManager<T> where T : ApplicationUser
{
    int CreateAsync(string user, string password);
}
公共接口IUserManager,其中T:ApplicationUser
{
int CreateAsync(字符串用户、字符串密码);
}
实际用户管理器类

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;
    }
}
public类UserManager:IUserManager其中T:ApplicationUser
{
私有IUserStore用户存储;
公共用户管理器(IUserStore用户存储)
{
this.userStore=userStore;
}
public int CreateAsync(字符串用户、字符串密码)
{
返回0;
}
}
UserStore的接口

public interface IUserStore<T> where T : ApplicationUser
{
}
public class UserStore<T> : IUserStore<T> where T : ApplicationUser
{
}
公共接口IUserStore,其中T:ApplicationUser
{
}
实际用户存储

public interface IUserStore<T> where T : ApplicationUser
{
}
public class UserStore<T> : IUserStore<T> where T : ApplicationUser
{
}
公共类UserStore:IUserStore其中T:ApplicationUser
{
}
统一配置

container.RegisterType(typeof (IUserManager<>), typeof (UserManager<>));
container.RegisterType(typeof (IUserStore<>), typeof (UserStore<>));
container.RegisterType(typeof(IUserManager)、typeof(UserManager));
RegisterType(typeof(IUserStore),typeof(UserStore));
希望这有帮助

很明显,有很多与你的应用程序不一样的地方,例如,不进行异步方法调用,不从模型中读取密码,等等。但是,它应该给出如何解决你概述的问题的想法

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


干杯迈克

我找到了解决方案,将unity配置更改为:

container.RegisterType<IUserStore<ApplicationUser>, 
            UserStore<ApplicationUser>>(new InjectionConstructor(new ApplicationDbContext()));
container.RegisterType(新的InjectionConstructor(新的ApplicationDbContext());

谢谢大家。

UserManager是一个公共属性,不是我的帐户控制器,这就是为什么它是大写的。为什么它是公共的?还有什么东西可以通过控制器访问它吗?我使用的是visual studio 2013,他们刚刚成功。顺便说一句,我没有改变。好吧,我知道你现在要做什么了。我已经关闭了我的示例的身份验证,因此我没有看到与您相同的内容。我真的不明白为什么那个属性是公共的,如果你把它改成私有的,它仍然编译得很好。是的,我只是忘了这么做。