建模這個我想是這樣如何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