Cyb*_*cop 1 c# dependency-injection ninject asp.net-mvc-5
在MVC 5中,我们得到了这样的帐户控制器.
public class AccountController : Controller
{
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
Run Code Online (Sandbox Code Playgroud)
我安装了Ninject来处理我的依赖注入.我有两个存储库,我想在我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
在ninject.web.common中,这就是我所做的
private static void RegisterServices(IKernel kernel)
{
kernel.Bind(typeof (ILicenserepository)).To(typeof (Licenserepository));
kernel.Bind(typeof (IUserRepository)).To(typeof (UserRepository));
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,我在浏览器上收到错误,说没有找到参数化的构造函数.如果我创建参数较少的构造函数,我的存储库不会被实例化.因此,无论我从存储库调用该方法,值都为null.我怎么解决这个问题?或者让MVC或Ninject知道要调用哪个构造函数?
您需要DependencyResolver在Global.asax.cs中注册
注册看起来像这样:
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));
}
Run Code Online (Sandbox Code Playgroud)
而且 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>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6722 次 |
| 最近记录: |