3

我在我的项目中使用依赖注入有一个小问题。为了描述问题,我将使用简单的例子。假设我在写记录器应用程序,并且最终用户可以选择是将日志保存到文件还是写入控制台。用户通过选择运行应用程序中的复选框来控制它。他可以选择两个或只有一个。选择后,点击“LOG”按钮执行操作。 现在我从我的DI的知识了解我应该创建接口:依赖注入和接口的很多实现

public interface ILogger 
{ 
    void log(); 
} 

和两个实现

public class ConsoleLogger : ILogger 
{ 
    public void log() 
    { 
     ... 
    } 
} 

public class FileLogger : ILogger 
{ 
    public void log() 
    { 
     ... 
    } 
} 

我知道我可以在例如统一容器都实现注册,并让他们在构造函数通过使用表,但是然后我不能识别哪个实施方式中是FileLogger并且其ConsoleLogger(在情况下,当用户仅选择一个复选框)

第二选项是解决IMPL使用服务定位器模式来自ioc的名字。我不知道这是否是一个好方法

在我的实际应用中,我将有更多的选择超过两个,有将每个选项是一个很大的共享接口。

也许最好是使用MEF?

应用程序将使用WPF + PRISM编写。

回答

3

我通常这样做的方式是让您的课程依赖于ILoggerFactory,它可以创建名称为​​的实例。

工厂实现,LoggerFactory,就拿着容器的内核,并能够通过名称解析组件。

通知工厂接口如何只告诉你,它可以创建对象 - 它不会给你任何潜在的内核,或DI框架任何暗示 - 工厂实现是知道这些细节的人。

事情是这样的:

public class MyLoggingClass 
{ 
    private readonly ILoggerFactory _loggerFactorty; 

    public MyLoggingClass(ILoggerFactory factory) 
    { 
     _loggerFactorty = factory; 

     var fileLogger = _loggerFactorty.Create("fileLogger"); 
     var consoleLogger = _loggerFactorty.Create("consoleLogger"); 
    } 
} 


public class LoggerFactory : ILoggerFactory 
{ 
    public ILogger Create(string key) 
    { 
     return kernel.Resolve<ILogger>(key); 
    } 
} 

框架,比如温莎城堡甚至给你这些工厂免费:你甚至不用写它的实现。

+0

我明白,我所有的工厂应该是我的根组成部分。谢谢! – niba

0

我没有看到创建自定义工厂的点,如果你想要的是国际奥委会的基本功能。如果您打算使用WPF和Prism开发应用程序,一个好方法是使用一个支持的IOC容器。我用Unity很多,非常喜欢它。另一个受支持的版本是MEF(如你所建议的)。

它们都允许您使用名称来解析接口。这是不错的做法,并提供了解决正确界面的结构化方式。

对于使用棱镜使用Unity或MEF,在这里看到:

http://msdn.microsoft.com/en-us/library/gg430868(v=pandp.40).aspx