2012-04-23 3 views
6

현재 FreeRADIUS에 대한 웹 인터페이스를 만들고 있습니다. Shell과 SQL-lazy 동료의 돌연변이를 단순화하기위한 작은 응용 프로그램입니다. 나는 데이터베이스를위한 Entity Framework 모델을 생성하고 파사드 패턴을 사용하여 캡슐화하려고합니다. 그래서 계정이라는 DTO 클래스를 만들었습니다. 세 가지 다른 테이블에서 집계 된 데이터를 저장합니다. Account.cs가 다음과 같이 표시됩니다.DTO가있는 DRY 상태 유지

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

이것은 하나의 계정 -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(); 
} 

하여 데이터베이스를 업데이트 할 수있는 방법이다, 나는 데이터베이스에서 데이터를 검색하는 동일한 코드를 사용합니다. 이 코드를 어떻게 DRY 할 수 있습니까?

+0

'공장 :: GetCheck (문자열 사용자 이름)','공장 :: GetUserGroup (문자열 사용자 이름) ', ...? –

+0

이 DTO는 레이어를 얼마나 깊이 통과합니까? 그것은 UI 레이어에서부터 DB 레이어까지 진행됩니까? –

+0

MVC 웹 응용 프로그램입니다 (모든보기에는 뷰 모델이 있습니다) DTO는 이러한보기 모델로 채워지 며 (이 경우 Account.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"), 
     } 
    } 
}