2012-04-23 4 views
6

現在、私はFreeRADIUSのウェブインターフェースを作成しています。シェルとSQLの怠惰な同僚のために突然変異を単純化するのはちょっとしたアプリです。データベースのEntity Frameworkモデルを作成し、ファサードパターンを使用してカプセル化したいと思います。そこで、アカウントというDTOクラスを作成しました。これは、3つの異なるテーブルから集計されたデータを格納します。これは、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; } 
} 

これは、私が1つの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(); 
} 

あなたが見ることができるように、私は、データベースからデータを取得するために、まったく同じコードを使用します。このコードをどのようにDRYできますか?

+0

'ファクトリー:: GetCheck(文字列ユーザー名)'、 'ファクトリー:: GetUserGroup(文字列ユーザー名)'、...? –

+0

このDTOはどのくらいの層を通って移動しますか?それはUIレイヤーからDBレイヤーに至るまで進んでいますか? –

+0

これはMVC Webアプリケーションです(すべてのビューにビューモデルがあります)。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"), 
     } 
    } 
}