0

Before using any dependency injection我用简单的interface做出loosely coupled code像下面 -如何在构造函数或任何条件下使用参数实现autofac依赖注入?

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(); 
     } 
+1

你可以使用[名]( http://docs.autofac.org/en/latest/advanced/keyed-services.html),即'builder.Register ().name (“oracleData”);''和'scope.ResolveNamed (“oracleData “);'。 – stuartd

+0

哦,我看到了,但我们怎么能使用它在构造函数或使用任何条件? – Neo

+0

在使用任何依赖注入之前,我使用简单的接口来创建一个松散耦合的代码,如下面的“public DataHandler([WithKey(”oracleData“)] Idata data){...}' – stuartd

回答

2

如果您需要定义将使用哪种实现在入口点,你可以做这样的事情:

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(); 
    } 
+0

但我想我们必须在不考虑条件的情况下注册所有类,我们需要使用条件或在构造函数中解决它? – Neo

+0

你可以直接做IData app = scope.Resolve ();如果您需要稍后决定。 – LeBaptiste

相关问题