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

相關問題