我正在尝试将我的对象更改为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一起放在构造函数中似乎很尴尬。我遵循的模式通常正确吗?

最佳答案

检查接口是否无法使用可访问性修饰符(如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; }
}


最后,在构建时设置属性并不是域变得丰富的要求。使域模型不是贫乏的是域对象不仅是数据存储,而且还提供了行为。

关于c# - 如何使用依赖注入(inject)正确实现富域模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37236518/

10-09 22:39