首页 > 解决方案 > 这个领域模型正确吗?

问题描述

注意:我不确定这是否是此类问题的正确位置。尽管大多数问题都是关于代码的,但我也看到了一些关于 UML 和图表的问题。请让我知道如果我做了一个oopsie,我会立即删除这篇文章。此外,这篇文章将包含相当多的代码,因此我可以更好地解释代码中发生了什么。

我开始为我的代码开发域模型(我知道,域模型应该是第一个),但是我在弄清楚我的类之间的箭头应该是什么样子时遇到了问题。从我所读的内容中,我有了一个小小的想法,但我仍然很困惑。

首先,这是我的域模型的链接。

User在创建一个新的类时用作模型AppUser,该类是IdentityUser.

AppUser仅在您需要时使用Login。我真的不确定这两个类之间是否有任何关系。下面你可以看到这两个类一起涉及的唯一部分。

public async Task<IActionResult> Login(Login login)
{
    if (ModelState.IsValid)
    {
        AppUser appUser = await userManager.FindByEmailAsync(login.Email);
        if (appUser != null)
        {
            await signInManager.SignOutAsync();
            Microsoft.AspNetCore.Identity.SignInResult result = await signInManager.PasswordSignInAsync(appUser, login.Password, false, false);
            if (result.Succeeded)
                return Redirect(login.ReturnUrl ?? "/");
        }
        ModelState.AddModelError(nameof(login.Email), "Login Failed: Invalid Email or password");
    }
    return View(login);
}

RoleEditRoleModification用于将条目分配给来自dbo.AspNetUsers的角色dbo.AspNetRoles

public async Task<IActionResult> Update(string id)
{
    IdentityRole role = await roleManager.FindByIdAsync(id);
    List<AppUser> members = new List<AppUser>();
    List<AppUser> nonMembers = new List<AppUser>();
    foreach (AppUser user in userManager.Users)
    {
        var list = await userManager.IsInRoleAsync(user, role.Name) ? members : nonMembers;
        list.Add(user);
    }
    return View(new RoleEdit
    {
        Role = role,
        Members = members,
        NonMembers = nonMembers
    });
}

[HttpPost]
public async Task<IActionResult> Update(RoleModification model)
{
    IdentityResult result;
    if (ModelState.IsValid)
    {
        foreach (string userId in model.AddIds ?? new string[] { })
        {
            AppUser user = await userManager.FindByIdAsync(userId);
            if (user != null)
            {
                result = await userManager.AddToRoleAsync(user, model.RoleName);
                if (!result.Succeeded)
                    Errors(result);
            }
        }
        foreach (string userId in model.DeleteIds ?? new string[] { })
        {
            AppUser user = await userManager.FindByIdAsync(userId);
            if (user != null)
            {
                result = await userManager.RemoveFromRoleAsync(user, model.RoleName);
                if (!result.Succeeded)
                    Errors(result);
            }
        }
    }

    if (ModelState.IsValid)
        return RedirectToAction(nameof(Index));
    else
        return await Update(model.RoleId);
}

一个Application可以有很多Releases。如果一个应用程序被删除,它的发布也将被删除。另外,Application必须发出一个单Environment(如Development、Testing等)

一个Release可以有很多Phases。如果一个版本被删除,它的阶段也将被删除。与应用程序相同,Release必须向单个Stage.

一个Phase可以有很多Tasks。如果一个阶段被删除,它的任务不会被删除。

一个Task可以有很多Dependencies

AppIdentityDbContext是用于与数据库连接的类。

ErrorViewModel是一个我只用过一次的类,并不是很重要。它应该保留在领域模型中吗?

我想就差不多了。我给你链接的领域模型还没有完成,因为我不确定我是否做对了。您可以给我的任何帮助、建议和提示都非常重要和欢迎!

感谢阅读这篇冗长文章并可以帮助我的人。

标签: c#relationshipdomain-model

解决方案


login 和 user...login 之间的关系用于从登录表单中捕获信息,然后您使用该信息在系统中查找用户并验证他们是否在系统中。它们在您的域模型中没有链接,因为登录类有一个返回 url,以防它们需要被重定向,并且仅用于登录某人。它们具有单独的功能,并且在以 MVC 模式编程的前提下,您正在分离您的担心这是一个很好的做法。

ViewModel 是模型,因此您可以将域数据公开给您的视图,但它不是域的一部分,因此 ErrorViewModel 不需要将其包含在您的图表中。

如果修改历史对您很重要,我会为您认为跟踪该信息很重要的类建议一个 ModifiedBy 和 ModifiedDate 字段。您还可以添加另一个字段“已删除”,因此如果有人删除了不应该删除的内容,您可以恢复该更改。您还可以向用户添加“LastLogin”日期时间字段以跟踪用户活动。


推荐阅读