2011-02-11 110 views
1

将配置信息注入到新构建的实例中的以下方法的优缺点是什么?你会用哪个?依赖注入设计问题

interface IApplicationConfiguration { 
    string SourcePath { get; } 
    string DestinationPath { get; } 
} 

选项之一:

class DailyFilePathProvider { 
    private readonly string sourcePath; 
    private readonly string destinationPath; 
    public DailyFilePathProvider(string sourcePath, string destinationPath) { 
     this.sourcePath = sourcePath; 
     this.destinationPath = destinationPath; 
    } 
} 

var configuration = container.Resolve<IApplicationConfiguration>(); 
var provider = new DailyFilePathProvider(configuration.SourcePath, configuration.DestinationPath); 

选项二:

class DailyFilePathProvider { 
    private readonly string sourcePath; 
    private readonly string destinationPath; 
    public DailyFilePathProvider(IApplicationConfiguration configuration) { 
     this.sourcePath = configuration.SourcePath; 
     this.destinationPath = configuration.DestinationPath; 
    } 
} 

var configuration = container.Resolve<IApplicationConfiguration>(); 
var provider = new DailyFilePathProvider(configuration); 

感谢所有的想法。

+0

我更愿意将ApplicationConfiguration *留在IoC之外 – 2011-02-11 14:48:11

+0

你是什么意思? – JackBlackAndWhite 2011-02-11 14:49:27

回答

0

我更喜欢选项2,所以我可以在不更改ctor的情况下轻松添加更多设置。我也将它切换到...

class DailyFilePathProvider { 
    private readonly IApplicationConfiguration configuration; 
0

第一个代码只使用某种依赖注入的解决要使用的配置,但构建DailyFilePathProvider当它不使用依赖注入。

所以我会选择第二个选项,你实际上正在将配置注入DailyFilePathProvider

这里有一些更多关于NInject模式为例:Injection patterns

1

这取决于

我会去选择两个if IApplicationConfiguration只包含与DailyFilePathProvider配置。如果它包含应用程序其他部分的配置,则可能会认为这是“错误的分离问题”。在这种情况下,更好的选择是将一个属性IDailyFilePathProviderCfg添加到IApplicationConfiguration,其中包含专门用于DailyFilePathProvider的配置。通过这种方式,您可以获得两全其美的效果,您只需注入像选项一中的相关数据,但代码也很容易维护,就像在选项二中一样。

就我个人而言,我认为应用程序范围的配置最好在静态类中抽象出来,因此代码的所有部分都可以轻松访问设置。

这个问题的答案很大程度上取决于我的个人编程风格。它还取决于您正在构建的应用程序的类型和大小。就我个人而言,我不喜欢在构造函数中注入比构建对象更多的内容。

1

我这个回答类似的问题可以提供一些见解:

Dependency Injection and AppSettings

的要点是,Confguration接口水暖这在消耗它的类没有增加语义值。还有一个如何构建应用程序的例子,以便可以轻松传播这些值。答案被标记为问题被接受的答案。