6

現在、 FreeRADIUSの Web インターフェイスを作成しています。これは、Shell と SQL を怠る同僚のミューテーションを簡素化するための小さなアプリです。データベースの Entity Framework モデルを作成し、ファサード パターンを使用してカプセル化したいと考えています。そこで、 Accountという DTO クラスを作成しました。3 つの異なるテーブルから集計されたデータを格納します。Account.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-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;
}

そして、これはユーザーが提出した 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 するにはどうすればよいですか?

4

1 に答える 1

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"),
        }
    }
}
于 2012-04-23T16:21:51.483 に答える