控制器的依赖注入


本文仅适用于 Asp.Net MVC

  在 Asp.Net MVC 中使用依赖注入不是太容易,它需要重写 DefaultControllerFactory 类的相关方法,实现控制器的注入。

  Fireasy 已经为你做好了这一切的准备工作,它的 IOC 使用的是 Container。你只需要在 Global 中将 DefaultControllerFactory 替换掉即可。如下所示:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        //MVC控制器工厂添加 IOC 容器
        var container = ContainerUnity.GetContainer();
        ControllerBuilder.Current.SetControllerFactory(new ControllerFactory(container));

        //注入所有控制器
        container.RegisterControllers(Assembly.GetExecutingAssembly());

        //注入DbContext
        container.Register<DbContext>(Lifetime.Scoped);
    }
}

  你需要调用扩展方法 RegisterControllers 将程序集中所有的控制器映射到容器中,这样,你就可以在控制器里使用注入了。如下所示:

public class HomeController : Controller
{
    private readonly DbContext _dbContext;

    public HomeController(DbContext dbContext)
    {
        _dbContext = dbContext;
    }
    
    public ActionResult Index()
    {
        return View();
    }
}

  除了使用构造器注入,你也可以使用属性注入,但注意属性必须是 public 的。如下所示:

public class HomeController : Controller
{
    public DbContext DbContext { get; set; }
    
    public ActionResult Index()
    {
        return View();
    }
}