2012-04-23 60 views
6

目前我正在爲FreeRADIUS創建一個Web界面。這只是一個小應用程序,用於簡化Shell和SQL懶惰同事的變化。我爲數據庫創建了一個實體框架模型,並希望通過使用Facade模式來封裝它。所以我創建了一個名爲賬戶的DTO類。它存儲從三個不同表中彙總的數據。這就是Account.cs的樣子:保持與DTO的幹

public class Account 
{ 
    public int? Id { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string GroupName { get; set; } 
    public string IpAddress { get; set; } 
    public string Route { get; set; } 
} 

這是我組裝並返回一個Account-DTO的方法。

Account Get(string userName) 
{ 
    // Get the values from the database. 
    var check = _entities.Checks.Single(x => x.UserName == userName); 
    var userGroup = _entities.UserGroups.Single(x => x.UserName == userName); 
    var ipReply = _entities.Replies.Single(x => x.UserName == userName && x.Attribute == "Framed-IP-Address"); 
    var routeReply = _entities.Replies.Single(x => x.UserName == userName && x.Attribute == "Framed-Route"); 

    // Populate the DTO 
    var account = new Account 
    { 
     UserName = check.UserName, 
     Password = check.Value, 
     GroupName = userGroup.GroupName 
    }; 

    if (ipReply != null) account.IpAddress = ipReply.Value; 
    if (routeReply != null) account.Route = routeReply.Value; 

    return account; 
} 

這是由用戶提交的帳號,DTO

void Update(Account account) 
{ 
    // Get the values from the database. Again. 
    var check = _entities.Checks.Single(x => x.UserName == account.UserName); 
    var userGroup = _entities.UserGroups.Single(x => x.UserName == account.UserName); 
    var ipReply = _entities.Replies.Single(x => x.UserName == account.UserName && x.Attribute == "Framed-IP-Address"); 
    var routeReply = _entities.Replies.Single(x => x.UserName == account.UserName && x.Attribute == "Framed-Route"); 

    // Update the possible attributes 
    check.Value = account.Password; 
    userGroup.GroupName = account.GroupName; 
    ipReply.Value = account.IpAddress; 
    routeReply.Value = account.Route; 

    _entities.SaveChanges(); 
} 

更新數據庫正如你所看到的方法,我使用完全相同的代碼從數據庫中檢索數據。我怎樣才能幹這個代碼?

+0

'廠:: GetCheck(用戶名字符串)','廠:: GetUserGroup(用戶名字符串)',...? – 2012-04-23 15:57:10

+0

這個DTO的層次有多深?它是否從UI層一直到數據庫層? – 2012-04-23 20:47:55

+0

這是一個MVC Web應用程序(每個視圖都有一個視圖模型)DTO被這樣一個視圖模型填充(在這種情況下,它看起來就像Account.cs)並被傳送到包含上述方法的外觀。 – Sandro 2012-04-23 22:57:13

回答

1

爲什麼不能簡單地提取共享代碼,本地類

class AcccountFieldsByName { 
// check, userGroup, ipReply, routeReply 

    static AcccountFieldsByName Read(... _entities, string userName)  
    { 
    return new AcccountFieldsByName { 
     check = _entities.Checks.Single(x => x.UserName == userName), 
     userGroup = _entities.UserGroups.Single(x => x.UserName == userName), 
     ipReply = _entities.Replies.Single(x => x.UserName == userName && x.Attribute == "Framed-IP-Address"), 
     routeReply = _entities.Replies.Single(x => x.UserName == userName && x.Attribute == "Framed-Route"), 
     } 
    } 
}