c# - 自动法。带参数的 IoC 容器。最佳实践
问题描述
在研究了Autofac 文档和一些 stackoverflow 问题之后
我知道我需要将容器放在更高的级别,然后通过所需的课程。
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 容器时,您必须在容器中注册所有服务。当请求服务时,容器负责创建所需服务的图表。
您可以像这样注册这两种服务:
builder.RegisterType<UserManager>().As<IUserManager>();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();
该WithParameter
方法对某些需求很有用,例如当您需要配置中的一些参数来创建实例时:
builder.RegisterType<XService>()
.As<Service>()
.WithParameter("key1", config.GetValue("key1"));
有关详细信息,请参阅autofac 文档中的将参数传递给 Register
推荐阅读
- google-apps-script - 访问已安装 Google Add-on 的附加代码
- flutter - 如何修改当前的块状态,如添加、更新和删除?
- fluentd - 在 fluentd 中使用具有不同匹配类型的单个源
- php - 根据mysql中的日期计算多行的分钟时间差
- session - 重新加载当前页面以填充会话
- ruby-on-rails - 路由错误未初始化常量聚会
- flutter - Flutter 将数组保存到 Firebase 数据库
- nuxt.js - nuxt.js 热重载很慢
- rust - 是否可以转换`借
` 到 `AsRef ` 或反之亦然? - python - 将多行 *.dat 记录解析为单行的最佳工具