SimpleInjector MVC 控制器注入不断给出编译器错误
SimpleInjector MVC Controller injection keeps giving compiler error
我正在使用简单的注入器,但是由于没有 0 个参数构造函数,我的 MVC 控制器一直失败并在构造函数中指定 class。
我在 Global.asax
中的代码用于注册所有控制器和简单注入器
container = new Container();
// register MVC controllers
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcIntegratedFilterProvider();
// register our objects
container.Register<ICacheManager, MemoryCacheManager>(Lifestyle.Singleton);
container.RegisterSingle<ILogger, NLogLogger>();
container.Register(typeof(UsersOnlineModule));
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
我的测试控制器class
public class SidcProjectController : Controller
{
public SidcProjectController(ICacheManager cm)
{
}
}
搜索控制器
public class SearchController : SidcProjectController
{
[HttpPost()]
public ActionResult Query(string query)
{
return View();
}
}
尝试编译此解决方案时出现编译器错误:
Error 2 'sidc.Framework.Web.Controllers.SidcProjectController' does
not contain a constructor that takes 0 arguments D:\Projecten\Software
Development\Source\Workspaces\SIDC\sidc\sidc\Areas\Projects\Controllers\SearchController.cs 10 18 sidc
SearchController 是作为基础的 SidcProjectController 类型,需要 ICacheManager 从缓存中读取值。
您收到编译器错误,因为您的 SearchController 继承自具有非默认构造函数的 SidcProjectController。 Simple Injector 不会将任何东西注入到这个构造函数中,因为它不能。 Simple Injector 不知道继承和 clr,正如编译器正确警告的那样,当它没有非默认构造函数时需要您创建基类。参见 MSDN。
您应该像这样从实现的构造函数中更新基础 class:
public class SearchController : SidcProjectController
{
public SearchController(ICacheManager cm) : base(cm)
{
}
}
了解您需要为基础控制器中需要的每个依赖项执行此操作。因此,如果你真的需要一个基地class,请三思!如果你真的需要一个它不应该依赖于任何东西,否则你很快就会违反 OCP 和 运行 陷入麻烦。
因此,虽然我的回答可以编译,但我强烈建议不要使用这种方法,因为您的基础 class 将成为维护的噩梦。
我正在使用简单的注入器,但是由于没有 0 个参数构造函数,我的 MVC 控制器一直失败并在构造函数中指定 class。
我在 Global.asax
中的代码用于注册所有控制器和简单注入器
container = new Container();
// register MVC controllers
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcIntegratedFilterProvider();
// register our objects
container.Register<ICacheManager, MemoryCacheManager>(Lifestyle.Singleton);
container.RegisterSingle<ILogger, NLogLogger>();
container.Register(typeof(UsersOnlineModule));
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
我的测试控制器class
public class SidcProjectController : Controller
{
public SidcProjectController(ICacheManager cm)
{
}
}
搜索控制器
public class SearchController : SidcProjectController
{
[HttpPost()]
public ActionResult Query(string query)
{
return View();
}
}
尝试编译此解决方案时出现编译器错误:
Error 2 'sidc.Framework.Web.Controllers.SidcProjectController' does not contain a constructor that takes 0 arguments D:\Projecten\Software Development\Source\Workspaces\SIDC\sidc\sidc\Areas\Projects\Controllers\SearchController.cs 10 18 sidc
SearchController 是作为基础的 SidcProjectController 类型,需要 ICacheManager 从缓存中读取值。
您收到编译器错误,因为您的 SearchController 继承自具有非默认构造函数的 SidcProjectController。 Simple Injector 不会将任何东西注入到这个构造函数中,因为它不能。 Simple Injector 不知道继承和 clr,正如编译器正确警告的那样,当它没有非默认构造函数时需要您创建基类。参见 MSDN。
您应该像这样从实现的构造函数中更新基础 class:
public class SearchController : SidcProjectController
{
public SearchController(ICacheManager cm) : base(cm)
{
}
}
了解您需要为基础控制器中需要的每个依赖项执行此操作。因此,如果你真的需要一个基地class,请三思!如果你真的需要一个它不应该依赖于任何东西,否则你很快就会违反 OCP 和 运行 陷入麻烦。
因此,虽然我的回答可以编译,但我强烈建议不要使用这种方法,因为您的基础 class 将成为维护的噩梦。