2012-04-23 10 views
6

के साथ DRY रहें वर्तमान में मैं FreeRADIUS के लिए एक वेब इंटरफ़ेस बना रहा हूं। शेल- और एसक्यूएल-आलसी सह-श्रमिकों के लिए उत्परिवर्तन को सरल बनाने के लिए यह एक छोटा सा ऐप है। मैंने डेटाबेस के लिए एक इकाई फ्रेमवर्क मॉडल बनाया और मुखौटा पैटर्न का उपयोग कर इसे encapsulate करना चाहते हैं। इसलिए मैंने खाता नामक एक डीटीओ कक्षा बनाई। यह तीन अलग-अलग तालिकाओं से एकत्रित डेटा संग्रहीत करता है। यह खाता.cs जैसा दिखता है:डीटीओ के

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 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; 
} 

और यह एक उपयोगकर्ता द्वारा सबमिट खाता-डीटीओ

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 (स्ट्रिंग उपयोगकर्ता नाम)', ...? –

+0

इस डीटीओ यात्रा से आपकी परतों के माध्यम से कितना गहराई है? क्या यह यूआई परत से डीबी परत तक नीचे जाता है? –

+0

यह एक एमवीसी वेब ऐप है (प्रत्येक दृश्य में एक दृश्य मॉडल है) डीटीओ ऐसे दृश्य मॉडल द्वारा पॉप्युलेट हो जाता है (इस मामले में, यह खाता.cs की तरह दिखता है) और मुखौटा में स्थानांतरित किया जाता है (जिसमें उपर्युक्त विधियां हैं)। – Sandro

उत्तर

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"), 
     } 
    } 
} 
संबंधित मुद्दे