首页 > 解决方案 > 自动法。带参数的 IoC 容器。最佳实践

问题描述

在研究了Autofac 文档和一些 stackoverflow 问题之后

IOC 容器的最佳实践

国际奥委会容器。注射容器

我知道我需要将容器放在更高的级别,然后通过所需的课程。

f.ex 我有高级类控制器

public class AccountController : Controller
{
    private readonly IUserManager userManager;
    public AccountController(IUserManager userManager) //I configure Global.asax and there will 
    {                                                  //be UserManager class. OK.
        this.userManager = userManager;
    }
}

在较低级别上,我有 UserManager 类和参数 IUnitOfWork。我应该把新的 UnitOfWork 实例放在那里还是用一些容器来做?

public class UserManager : IUserManager
{
    readonly IUnitOfWork _unitOfWork;
    public UserManager (IUnitOfWork unitOfWork)
    {
        this._unitOfWork = unitOfWork;
    }
}

一块 autofac 配置。

conteinerBuilder.RegisterType<UserManager>().As<IUserManager>()
            .WithParameter("unitOfWork",new UnitOfWork()) //This is what bothers me
                                                          //Like I understand we wanna 
                                                          //work with abstraction not with some 
                                                          //implementations but there I must use 
                                                          //UnitOfWork

告诉我用什么方法挖,我完全糊涂了。如有任何帮助,我将不胜感激。=)

标签: c#asp.netdependency-injectioninversion-of-controlautofac

解决方案


使用 IOC 容器时,您必须在容器中注册所有服务。当请求服务时,容器负责创建所需服务的图表。

您可以像这样注册这两种服务:

builder.RegisterType<UserManager>().As<IUserManager>();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();

WithParameter方法对某些需求很有用,例如当您需要配置中的一些参数来创建实例时:

builder.RegisterType<XService>()
       .As<Service>()
       .WithParameter("key1", config.GetValue("key1"));

有关详细信息,请参阅autofac 文档中的将参数传递给 Register


推荐阅读