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 将成为维护的噩梦。