c# - MVC5 和 Ninject :Parameterless constructor error

标签 c# dependency-injection ninject asp.net-mvc-5

在 MVC 5 中,我们得到了如下所示的帐户 Controller 。

public class AccountController : Controller
        {

            public AccountController()
                : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
            {

            }

            public AccountController(UserManager<ApplicationUser> userManager)
            {
                UserManager = userManager;
            }
        }

我安装了 Ninject 来处理我的依赖注入(inject)。我有两个存储库,我想在我的 AccountController 中使用 代码现在看起来像这样

    public class AccountController : Controller
    {
              private readonly ILicenserepository _licenserepository;
              private readonly IUserRepository _userRepository;    

        public AccountController(ILicenserepository licenserepository, IUserRepository userRepository)
            : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
        {
            _licenserepository = licenserepository;
            _userRepository = userRepository;
        }

        public AccountController(UserManager<ApplicationUser> userManager)
        {
            UserManager = userManager;
        }
    }

在 ninject.web.common 这就是我所做的

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind(typeof (ILicenserepository)).To(typeof (Licenserepository));
    kernel.Bind(typeof (IUserRepository)).To(typeof (UserRepository));
}    

但是当我运行该应用程序时,我在浏览器上收到错误消息,提示未找到无参数构造函数。如果我创建无参数构造函数,我的存储库不会被实例化。因此,无论我从存储库调用该方法的什么地方,该值都是空的。 我怎么解决这个问题?或者让 MVC 或 Ninject 知道要调用哪个构造函数?

最佳答案

您需要在 Global.asax.cs 中注册一个 DependencyResolver

注册看起来像这样:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    RegisterDependencyResolver();
}

private void RegisterDependencyResolver()
{
    var kernel = new StandardKernel();

    // you may need to configure your container here?
    RegisterServices(kernel);

    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}

还有 DependencyResolver

public class NinjectDependencyResolver : IDependencyResolver
{
    private readonly IKernel kernel;

    public NinjectDependencyResolver(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public object GetService(Type serviceType)
    {
        return this.kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return this.kernel.GetAll(serviceType);
        }
        catch (Exception)
        {
            return new List<object>();
        }
    }
}

关于c# - MVC5 和 Ninject :Parameterless constructor error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21312516/

相关文章:

asp.net mvc 内存泄漏

c# - 如何在不使用服务定位器模式的情况下访问 Ninject.Kernel

c# - Visual Studio 代码的自动完成不适用于 C#/Unity

c# - IProgress<T> 未触发

c# - 如何自动绕过 RDP 上的登录消息?

asp.net - 简单注入(inject)器 - 解析 MVC Controller 时没有为此对象定义无参数构造函数

.net - 现实生活与SOLID开发一起工作

c# - Xamarin Forms 图像大小不匹配

java - Spring Boot 中的策略

c# - 嵌套用户控件的数据上下文