如何使用依赖注入正确实现富域模型

时间:2016-05-15 09:17:34

标签: c# dependency-injection

我正在尝试将对象更改为Rich域模型。在尝试用富域模型替换它之前,我的原始类是这样的:

public class StudentLogic : IStudentLogic
{
    private IUnitOfWork _uow;
    private IStudentRepository _studentRepository;

    public StudentLogic(IUnitOfWork uow, 
        IStudentRepository studentRepository)
    {
        _uow = uow;
        _studentRepository = studentRepository;
    }

    public int CreateStudent(IStudent newStudent)
    {
        return _studentRepository.Create(newStudent);
    }
}

将IStudent声明为:

public interface IStudent
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

所以现在我尝试转换为Rich域模型。

如果没有FirstName和LastName,学生就不能存在,所以根据我读到的关于Rich域模型的内容,这应该包含在构造函数中。我对学生的丰富域名模型如下所示:

public class Student : IStudent
{
    public Student(string firstName, string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public int Create()
    {
        return _studentRepository.Create(this);
    }
}

如何注入UoW和存储库?将它与firstName和lastName一起放在构造函数中似乎很尴尬。我遵循的模式一般是正确的吗?

1 个答案:

答案 0 :(得分:2)

检查接口是否无法使用public等辅助功能修饰符声明成员,并且无法定义字段,但属性,事件,方法...... 我在编辑它的问题中解决了这个问题......

另一方面,富域模型不会创建持久的域对象,代表整个创建的方法也不会返回一个整数,但创建的域对象。

关于依赖注入,在C#中,根据控件容器的反转,您可以使用构造函数依赖属性依赖注入依赖项

使用构造时间依赖性的全部意义在于它们是强制性的。如果您的域对象无法在没有存储库和工作单元实现的情况下工作,那么您需要在域对象中要求它们。构造函数。否则,如果某些依赖项是可选,则可以使用属性注入注入它:

public class Some 
{
    // Mandatory, because a non-optional constructor parameter
    // must be provided or C# compiler will cry
    public Some(IUnitOfWork uow) { ... }

    // Optional, because you may or may not set a property
    public IRepository<...> Repo { get; set; }
}

最后,在施工时设置属性并不是域的要求。使域模型不贫穷的原因是域对象不仅仅是数据存储,而是提供行为