2017-07-20 72 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

相关问题