2017-07-20 88 views
0

我對Autofac非常陌生,無法理解註冊的語法。我有以下calsses /接口:Autofac - 註冊以接口爲參數的實例類型

//Interface 
public interface ISender 
{ 
    void Send(); 
} 


//implementations 
public class Post : ISender 
{ 
    public void Send() 
    { 
     //Post implementation 
    } 
} 

public class Email : ISender 
{ 
    public void Send() 
    { 
     //Email implementation 
    } 
} 

以及調用這些實現現在

public class Consumer 
{ 
    ISender Sender; 

    public Consumer(ISender sender) 
    { 
     Sender = sender 
    } 

    public void Act() 
    { 
     Sender.Send(); 
    } 
} 

一類,它實現調用是在一個控制器來決定,所以我嘗試使用IIndex從this page像:

public calss PostController 
{ 
    Consumer ConsumerObject; 
    public PostController(IIndex<string, Consumer> consumer) 
    { 
     ConsumerObject = consumer["post"]; 
    } 

} 

public class EmailController 
{ 
    Consumer ConsumerObject; 
    public PostController(IIndex<string, Consumer> consumer) 
    { 
     ConsumerObject = consumer["email"]; 
    } 
} 

首先,它是正確的還是可行的?現在的問題是我不明白如何註冊Autofac。那麼,我們如何在Autofac中註冊Consumer和ISender?請建議是否有更好的/替代方法。

回答

0

在Autofac中註冊組件的方法在文檔here中有廣泛的描述。在您鏈接的文檔中描述瞭如何使用鍵控服務。

基本上,您必須創建ContainerBuilder,根據您擁有的項目類型註冊所有組件並構建容器本身。

在你的情況,你需要使用下面的註冊:

var builder = new ContainerBuilder(); 
builder.RegisterType<Post>().Keyed<ISender>("post"); 
builder.RegisterType<Email>().Keyed<ISender>("email"); 
builder.RegisterType<Consumer>(); 

如果使用ASP.NET的WebAPI(我認爲根據您使用控制器的事實),你需要註冊你的控制器

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

或MVC

builder.RegisterControllers(typeof(MvcApplication).Assembly); 

現在,有多種方式選擇Consumer與適當的ISender實現(我假設你想在控制器中選擇正確的實現)。

之一將是注入IIndex<string, ISender>Consumer類和正確的密鑰字符串傳遞給它,以及:

public class Consumer 
{ 
    ISender Sender; 

    public Consumer(string type, IIndex<string, ISender> sender) 
    { 
     Sender = sender[type]; 
    } 

    public void Act() 
    { 
     Sender.Send(); 
    } 
} 

然後,控制器可以使用Func注:

public class PostController 
{ 
    Consumer ConsumerObject; 
    public PostController(Func<string, Consumer> consumer) 
    { 
     ConsumerObject = consumer("post"); 
    } 
} 

public class EmailController 
{ 
    Consumer ConsumerObject; 
    public EmailController(Func<string, Consumer> consumer) 
    { 
     ConsumerObject = consumer("email"); 
    } 
} 

另一種可能用Register方法註冊消費者兩次,並在註冊時間內解析ISender

相關問題