2012-03-22 97 views
0

可以说我有一个类将一个IFileLogger作为构造函数参数。在类相关性上分配属性

public MyClass : IClass 
{ 
    private IFileLogger Logger; 
    public MyClass(IFileLogger Logger) 
    { 
     this.Logger = Logger; 
    } 
} 

某处在该类调用Logger.Write("Data");

IFileLogger具有目录路径的属性;

这需要设置,以便IFileLogger知道在哪里写文件。

这是如何设置的?

我的想法是获得设置的类的属性,然后在构造函数中有类似IFileLogger.DirectoryPath = this.DirectoryPath。

这似乎是错误的,因为IClass需要拥有它的属性,并且最终创建一个只在底层需要的属性链。

你能帮助那些看不到树木的人吗?你也会写测试和如何,以确定IFileLogger的DirectoryPath填充?

回答

0

我可以建议你的界面设计是这里的问题和你的问题是臭味的迹象?

IFileLogger表示您的类所依赖的接口。因此,看看界面,我们看到有一个Write方法。事情是,MyClass并不在乎如何记录发生,只是它符合接口。据说,MyClass需要知道目录位置以便告诉IFileLogger如何执行它的工作的想法告诉你,责任是错位的。

代码需要什么IFileLogger?记录,对吧?让我们稍微重构代码并实现接口以满足客户端的需求MyClass。他不在意如何记录发生,只是它发生。

改为将接口重命名为​​。

public MyClass : IClass 
{ 
    private ILogger Logger; 
    public MyClass(ILogger Logger) 
    { 
     this.Logger = Logger; 
    } 
} 

既然在这个类中没有任何引用“文件”的地方使得它更明显的是目录设置不属于这里。它属于哪里?可能在FileLogger本身。

使用依赖注入将离开你的东西,如:

main() { 
    // Poor man's DI, no frameworks here 
    var logger = new FileLogger("some/directory"); 
    var instance = new MyClass(logger); 
    return instance.DoSomethingUsefulThatEventuallyGetsLogged(); 
} 

希望帮助!

布兰登

0

如何以及在哪里实例化一个IFileLogger,它听起来是设置其属性的地方。

builder.RegisterType<FileLogger>().WithParameter(new NamedParameter("directoryPath", @"c:\temp")).As<IFileLogger>(); 

有了这个配置,您将使用建设者随时解决IFileLogger,它将使用“C:\ TEMP”的目录路径。

+0

这将通过IOC容器 – Jon 2012-03-22 14:46:03

+0

完成在这种情况下,FileLogger构造应在参数RepositoryPath,(并将其设置为当然RepositoryPath属性),你应该注入参数而你正在解决IFileLogger。 – user484189 2012-03-22 14:55:00

+0

您使用哪种IOC框架? – user484189 2012-03-22 14:57:16

0

一般来说,我会说你的对象应该准备好使用一次构造,并且不得不调用其他方法/属性来准备它只是混淆。所以记录器在将它传递到MyClass之前应该已经设置了它的DirectoryPath属性。 E.g:

SomeInitialisationMethod 
    () 
{ 
    // or use IOC "factory" to create necessary concrete version. 
    IFileLogger logger = new LoggerVariant("path"); 

    // MyClass can now use the ready to use logger. If we need to set the DirectoryPath, we can do it on this calling stack through the logger. 
    MyClass myClass = new MyClass(logger); 
+0

你会怎么做? – Jon 2012-03-22 14:50:16

+0

如果MyClass ie IClass是具有InitlisationMethod的类的构造函数参数,该怎么办?这就是我的代码的样子 – Jon 2012-03-22 15:03:51