【问题标题】:Autofac. IoC container with parameters. Best practices自动法。带参数的 IoC 容器。最佳实践
【发布时间】:2020-03-13 19:25:37
【问题描述】:

研究了Autofac documentation,以及一些stackoverflow问题

Best Practices for IOC Container,

IoC Container. Inject container

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

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

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

【问题讨论】:

  • 只需注册您的类型,默认情况下它会为您解析构造函数参数。由于您是 IoC 的新手,您可能想观看这个超级方便的视频:Deep Dive Into Dependency Injection And Writing Decoupled Quality and Testable Code
  • 为什么没有两个注册?第一个IUserManagerUserManager 和第二个IUnitOfWorkUnitOfWork。我个人不使用 AutoFac,但任何容器都应该递归解析,这样当它解析 UserManager 时,它将自动使用 UnitOfWork 注册。

标签: c# asp.net dependency-injection inversion-of-control autofac


【解决方案1】:

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

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

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

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

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

有关更多信息,请参阅 autofac 文档中的Passing parameters to Register

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多