我正在尝试将我的对象更改为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/