我想知道将模型用作存储库是否正确。原因是它会更简单,在某些情况下会更有意义。我不确定这是否是最好的做事方式,所以也许有人可以指出我是否朝着正确的方向前进。
您有Account
,每个Account
都有Sessions
和Projects
。现在做acc.AddProject("new project")
和acc.DeleteProjectById(3)
之类的事情而不是在控制器中拉动存储库并浪费代码空间会更加明智吗?
到目前为止,这就是我所知道的,我想知道我是否会在这方向前进。
public class Account
{
public ObjectId Id { get; set; }
public string Email { get; set; }
public string PasswordHash { get; set; }
public string PasswordSalt { get; set; }
public IQueryable<Project> Projects
{
get
{
var kernel = NinjectWebCommon.Bootstrapper.Kernel;
var projectRepository = kernel.Get<IProjectRepository>();
return projectRepository.GetByAccountId(Id);
}
}
public IQueryable<AccountSession> Sessions
{
get
{
var kernel = NinjectWebCommon.Bootstrapper.Kernel;
var sessionRepository = kernel.Get<IAccountSessionRepository>();
return sessionRepository.GetByAccountId(Id);
}
}
public Project AddProject(string name, string description)
{
var kernel = NinjectWebCommon.Bootstrapper.Kernel;
var projectRepository = kernel.Get<IProjectRepository>();
return projectRepository.Add(name, description, Id.ToString());
}
public AccountSession AddSession(string ip, string hash, string salt)
{
var kernel = NinjectWebCommon.Bootstrapper.Kernel;
var sessionRepository = kernel.Get<AccountSessionRepository>();
return sessionRepository.Add(Id.ToString(), ip, hash, salt);
}
}
答案 0 :(得分:2)
您所谈论的内容似乎是两种方法的混合。
首先,在模型上使用这些方法类似于Active Record Pattern。这种模式基本上意味着每个对象都有CRUD
个操作。
然而,听起来你也想要一个从Domain Driven Design演变而来的设计,其中对象本身包含所有必需的逻辑(而不是带有&#34; Service&#34;类的六边形结构)。
DDD没有声明持久性是模型的一部分 - 但逻辑是。您仍然会将持久性保留在专用存储库中,但您的所有逻辑都将存在于模型中。然后您的存储库就会按原样更新模型。我们的想法是,您的代码在您的域的内部工作方式上变得更具表现力(这是您在代码示例中的目的)。
答案 1 :(得分:1)
我通常不会。我喜欢将我的服务与他们传递的DTO分开。减少耦合主要是个人偏好。
如果要覆盖方法怎么办?您现在正在扩展DTO而不是服务,从而产生新的DTO。在我看来,它太过于耦合了。
答案 2 :(得分:0)
我不会这样做。这听起来不像DDD。让我指出为什么不是这样的事情。