【发布时间】:2016-11-16 17:08:29
【问题描述】:
Before using any dependency injection 我正在使用简单的interface 来制作loosely coupled code,如下所示 -
Program.cs
class Program
{
static void Main(string[] args)
{
Customer obj = new Customer(new OracleData());
obj.Add();
}
}
Customer.cs
public class Customer
{
private Idata iobj;
public Customer(Idata newiobj)
{
iobj = newiobj;
}
public void Add()
{
iobj.AddData();
}
}
OracleData.cs
public class OracleData : Idata
{
public void AddData()
{
throw new NotImplementedException();
}
}
SQLData.cs
public class SQLData : Idata
{
public void AddData()
{
throw new NotImplementedException();
}
}
Idata.cs
public interface Idata
{
void AddData();
}
现在我使用Autofac DI 库尝试了这个 -
我想知道它总是最后注入的类对象,如何使用构造函数或任何条件设置解析对象?
使用 Autofac DI 编码 -
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Customer>();
builder.RegisterType<OracleData>().As<Idata>();
builder.RegisterType<SQLData>().As<Idata>();
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
var app = scope.Resolve<Idata>();
app.AddData();
}
//commented
//Customer obj = new Customer(new OracleData());
//obj.Add();
}
【问题讨论】:
-
你可以使用names,即
builder.Register<OracleData>().Named<Idata>("oracleData");和scope.ResolveNamed<Idata>("oracleData");。 -
哦,我明白了,但是我们如何在构造函数中使用它或使用任何条件?
-
在链接的文章中,
public DataHandler([WithKey("oracleData")] Idata data) { ... } -
“在使用任何依赖注入之前,我使用简单的接口来制作如下所示的松散耦合代码”。您的示例清楚地显示了依赖注入,因此您之前使用的是依赖注入,而不是 IoC 容器,它是应用 DI 时的可选工具。
标签: c# dependency-injection inversion-of-control autofac ioc-container