依赖注入 - 我应该注入“实用程序类”

时间:2013-03-01 12:32:14

标签: c# serialization language-agnostic dependency-injection

我正在审查现有代码,并且有一个“bean”类:

[Serializable]
public class MyData {
 string S {get;set;}
 int I {get;set;}
 //bla bla bla
 private IStringConverter sc;
 public MyData(IStringConverter sc){this.sc=sc}
}

我认为在Model类中注入Utility类/处理程序或其他内容是完全错误的,原因有二: 1)这可以防止序列化 2)为什么?模型类不应该有行为。

你同意吗? (我应该改变这样写的课吗?)

3 个答案:

答案 0 :(得分:3)

您可以改为创建一个在DTO实例上运行且注入了依赖关系的新服务。这样你就可以从DTO中获得行为,而且一切都很干净。良好的建筑设计。

答案 1 :(得分:2)

将服务注入DTO可能不是最好的主意:)

我会考虑使用将服务作为参数的扩展方法。

通过这种方式,“行为”与DTO分离,序列化不是问题。

答案 2 :(得分:0)

扩展方法可能是要走的路,但我认为这有点像使你的逻辑成为编译时单例,如果它永远不会改变就没问题。

所以我会尝试这样的事情,因为从字面上看,一切都是基于合同和可注射的

public class Poco
{
    public int Foo;
    public int Bar;
}

public class PocoUtility : IPocoUtility
{
    private IService _service; 
    public PocoUtility(IService service)
    {   
        _service = service;
    }

    public Result DoSomethingWithPoco(Poco poco)
    {
        return _service.Convert(poco);
    }
}

public class SomethingThatUsesAPoco
{
    private IPocoUtility _logicForSomething;

    public SomethingThatUsesAPoco(IPocoFactory pocoFactory,  IPocoUtility logicForSomething)
    {
        _poco = pocoFactory.CreateInstance();  
    }

    public Result DoIt()
    {
        return _logicForSomething.DoSomethingWithPoco(_poco);
    }
}