建模这个我想是这样如何DDD和存储库模式
public class FooService
{
public GetById(ISecurityContext context, id)
{
//checking context has right to view
//calling Foo repository to getById
}
public Add(ISecurityContext context,Foo fooEntity)
{
//checking context has right to add
//calling Foo repository to add
}
}
在上面的方法我想通过不同类型的SecurityContext 的所以我必须做模型服务
Public Interface ISecurityContext
{
}
UsernamePasswordContext : ISecurityContext
{
public string Username { get; set; }
public string Password { get;set; }
}
SessionContext : ISecurityContext
{
public string SessionId {get ; set;}
}
所以在我的账户服务,我有一个方法
public class AccountService
{
public Account GetAccountFromSecurityContext(ISecurityContext context)
{
if(context is UsernamePasswordContext)
return GetAccountByUsernamePassword(context.Username,context.Password);
else if (context is SessionContext)
return GetAccountBySessionId(context.SessionId);
// more else if for different type of context
}
}
在上面的代码我没有LIK编那么多,如果别人 所以我尝试引入多态性
所以在我ISecurityContext界面我添加了所有子类将实现
Public Interface ISecurityContext
{
Account GetAccount();
}
UsernamePasswordContext : ISecurityContext
{
public string Username { get; set; }
public string Password { get;set; }
public Account GetAccount()
{
//call account service
GetAccountByUsernamePassword(this.Username,this.Password);
}
}
和我的账户服务会变成这个样子
public class AccountService
{
public Account GetAccountFromSecurityContext(ISecurityContext context)
{
context.GetAccount();
}
}
一个GetAccount方法
但这里的问题是,我从我的UsernamePasswordContext POCO调用服务/存储库,这说明DDD
那么我可以通过其他方式来模拟这种情况。
我认为当你添加帐户服务并用它来根据上下文生成帐户时你是在正确的线上,尽管我可能会使用工厂来生成基于上下文类型 – Dave 2012-02-16 16:30:11
的帐户,但是,工厂将需要参考存储库,这将再次违反DDD – 2012-02-16 17:13:59
你在这里做什么?你认为'UsernamePasswordContext'是你域中的一个实体吗?你提供的例子表明你试图将你的逻辑放在服务和存储库中。更多的DDD方法会把你的大部分逻辑放到你的领域模型中(你可能已经在做,但你的例子让我感到困惑)。 – 2012-03-27 11:37:45