【发布时间】:2017-10-27 08:49:23
【问题描述】:
我有一个这样的类(WebApi 2 Controller):
class DatabaseAnalysisController (IDatabase databaseOne,
IDatabase databaseTwo) : ApiController
还有这样的课程:
class Database : IDatabase
现在我有两个实例:
Database databaseOne = new Database("one");
Database databaseTwo = new Database("two");
我不希望DatabaseAnalysis 对 Autofac 有任何依赖。但是我想使用Autofac根据构造函数的参数名称进行注入。
我正在使用Autofac.WebApi 注册我的控制器。
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
但在那之后就不行了,因为databaseOne和databaseTwo都是IDatabase。
builder.RegisterInstance(new Database("one")).As<IDatabase>();
Autofac 是否可以将databaseOne 注入DatabaseAnalysis 的构造函数的databaseOne(也可以将databaseTwo 注入databaseTwo)?
如果是这样,怎么办? :P
【问题讨论】:
-
builder.Register<DatabaseAnalysisController>(c => new DatabaseAnalysisController(new Database("one"), new Database("two"))).InstancePerLifetimeScope();工作吗? -
那行得通。但我想让它纯粹在 parameterNames 上工作,而不必在注册中使用 DatabaseAnalysisController。
-
@Evk 的解决方案是否符合要求?
-
确保您没有违反Liskov Substitution Principle。一个很好的检查是问自己当您交换数据库参数时会发生什么(因此将 db2 注入
databaseOne参数,反之亦然)。如果这破坏了您的控制器,那么您就违反了 LSP。在这种情况下,每个数据库都应该获得自己的抽象。 -
@Steven,你基本上是说我应该去找 NightOwl888 的答案 ;-)
标签: c# dependency-injection inversion-of-control autofac