c# - 使用 DTO 保持 DRY

标签 c# entity-framework oop dry

目前我正在为 FreeRADIUS 创建一个网络界面.它只是一个小应用程序,用于简化对 Shell 和 SQL 惰性同事的修改。我为数据库创建了一个 Entity Framework 模型,并希望使用外观模式对其进行封装。所以我创建了一个名为 Account 的 DTO 类。它存储从三个不同表聚合的数据。这是 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 这段代码?

最佳答案

为什么不简单地将共享代码提取到本地类

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"),
        }
    }
}

关于c# - 使用 DTO 保持 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10283883/

相关文章:

c# - 使用 toString 进行格式化,以便我得到某种图表

c# - Entity Framework 导致超时错误

c# - Entity Framework 包含一个条件

c# - 返回对象计数和列表的 Linq toEntity 查询

c++ - 需要帮助让类(class)相互交流

java - 没有getter方法就不能使用对象变量

performance - 在 C# 中进行模拟退火时,OOP 比结构化编程慢得多。为什么以及如何修复它?

c# - 模拟 HttpPostedFileWrapper

C# POS 打印机 API : can't find printer

c# - AppDomain 不应该引起的异常?