如何使用构造函数中的参数或任何条件实现 autofac 依赖注入?
how to implement autofac dependency injection with parameter in constructor or with any condition?
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 库 -
我想知道它总是最后注入的 class 对象,如何使用构造函数或任何条件设置解析对象?
代码使用 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();
}
如果您需要定义您将在入口点使用的实现,您可以这样做:
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Customer>();
if(args[0] == "oracle")
builder.RegisterType<OracleData>().As<Idata>();
else
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();
}
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 库 -
我想知道它总是最后注入的 class 对象,如何使用构造函数或任何条件设置解析对象?
代码使用 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();
}
如果您需要定义您将在入口点使用的实现,您可以这样做:
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Customer>();
if(args[0] == "oracle")
builder.RegisterType<OracleData>().As<Idata>();
else
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();
}