小编Lou*_*ton的帖子

DDD架构 - 放置常用方法/助手的位置

根据Stack Overflow上的这个问题,在DDD架构中,"helper"类可以根据其目的在不同的层中.例如,以用户友好的方式格式化某些内容的助手将进入UI.数据库帮助程序将进入基础结构.

但是可以由多个层使用的助手呢?例如年龄计算.业务逻辑的模型层可能需要年龄.它由多个实体使用,因此不应该在特定实体中.此外,还有一些地方需要年龄仅用于UI中的显示目的.同样,我有多个字符串函数,可以由多个图层使用.例如,我的自定义Right和Left方法可以用于UI中的格式化,但它们也可以在模型中使用,例如基于前缀的条件逻辑.

那么这些常用方法应该去哪里?我的设置是这样的:

  • UI
  • 应用
  • 模型
  • 基础设施

模型是核心,并且不依赖于基础架构,因此常见的帮助程序无法进入基础架构.我正在考虑两种选择:

1)具有可以由任何层使用的另一个名为Common或类似的层.这将在Model和Common之间创建依赖关系.

2)在需要的任何层中复制辅助逻辑.例如,在UI中有一个Age帮助器,并且在Model中有一个Age帮助器.这会违反DRY,但不会要求域依赖于"公共"层.

哪个选项更好?模型层是否可以依赖"公共"图层?

更新:

在问这个问题后的2.5年里,我得出结论:

  1. 像Right,Left等补偿框架中的限制的东西属于"公共"实用程序/辅助组件,即使模型/域层依赖于它.
  2. "Common"实用程序/帮助程序组件不应该很大.凭借更多的经验,我发现许多我认为是帮助者的东西实际上都属于领域模型.
  3. Age属于域层中自己的类.就像地址,电话号码和金钱一样,我把这些东西视为价值对象.理解值对象确实是我理解创建可以包含在其他类中的可重用域类的关键.

architecture domain-driven-design

12
推荐指数
2
解决办法
4386
查看次数

ViewModel子对象的命名约定

我正在使用ViewModel方法构建一个ASP.Net MVC应用程序,以使我的域实体与我的UI使用的"模型"分开.我使用以下约定来命名我的ViewModel类.ViewModelName = ViewName +"ViewModel".例如:

Index + ViewModel = IndexViewModel
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是一个相当常见的模式,在StackOverflow和其他地方有很多关于这个主题的指导.我的问题涉及我的ViewModel使用的子对象.如果我的ViewModel需要一个具有与我的域模型对象相同属性的类,我只需在我的ViewModel中包含域模型.例如:

public class PersonViewModel
{
    public int PersonID { get; set; } 
    public Address Address { get; set; }
    public string SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我需要一个与我的域模型具有不同属性的子对象时,我不确定使用什么命名约定.例如,如果Address除了Address域模型中的内容之外还需要一些其他属性,我应该怎么称呼它?我认为AddressViewModel是这样的:

public class PersonViewModel
{
    public int PersonID { get; set; } 
    public AddressViewModel Address { get; set; }
    public string SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但这对我来说感觉不对.我的直觉是,ViewModel后缀应仅适用于顶级ViewModel.

我正在寻找其他开发人员在这种情况下使用的命名约定的建议,特别是在这种情况下你会称之为子对象的是什么?

asp.net-mvc naming-conventions asp.net-mvc-viewmodel

7
推荐指数
1
解决办法
2248
查看次数

C#预定系列任务

我正在将Classic ASP/VBScript应用程序转换为C#/ ASP.Net.应用程序的VBScript部分是在特定日期每月执行的一系列单独脚本,每个单独的任务都在Windows Scheduler中设置.大约有35个任务包括数据库插入(保存月度历史数据,保存汇总计费数据)以及将一系列Crystal Reports导出为PDF和Excel.每个任务的安排距离大约一分钟,因为我不希望同时请求压倒数据库服务器.

当我在C#中使用它时,我想知道在一个应用程序中是否有一种方法,而不是我使用VBScript的单独脚本方法.我对C#很满意,因为我在过去一年左右的时间里一直用它将应用程序的网站部分转换为ASP.Net MVC,但我没有C#中定时事件的经验.我正在考虑通过为每个任务创建一个单独的函数来解决这个问题,在每个任务之间保持休眠状态,以便在继续执行下一个任务之前有足够的时间进行数据库处理.类似于以下内容:

p.DoTask1();
Thread.Sleep(60000);
p.DoTask2();
Thread.Sleep(60000);
p.DoTask3();
Thread.Sleep(60000);
etc ...
Run Code Online (Sandbox Code Playgroud)

这将包含在一个控制台应用程序中,该应用程序本身将在Windows Scheduler中设置.

这是一个合理的方法吗?有更好的方法吗?我读过有关计时器和任务的内容,但我不确定它们是否适合我想要完成的任务.

c# asp.net sleep scheduled-tasks

5
推荐指数
1
解决办法
586
查看次数

在 ClaimsPrincipal 中添加多个身份

我看到很多类似下面的代码来创建新的 ClaimsIdentity 和 ClaimsPrincipal

var claims = new List<Claim>() {
new Claim(ClaimTypes.Name, "Me"),
new Claim(ClaimTypes.Email, "email@me.com"),
new Claim(ClaimTypes.Role, "Admin")
};

var id = new ClaimsIdentity(claims, "Forms");
var principal = new ClaimsPrincipal(id);
Run Code Online (Sandbox Code Playgroud)

这很简单,网上有很多关于如何执行此操作的示例。我想做但没有找到太多关于如何在 ClaimsPrincipal 中拥有多个身份的文档。ClaimsPrincipal 的定义如下,很明显它支持多个身份。

public class ClaimsPrincipal : IPrincipal
{
  public virtual IEnumerable<ClaimsIdentity> Identities { get; }
  ...
}
Run Code Online (Sandbox Code Playgroud)

我认为上述声明 varprincipal = new ClaimsPrincipal(id) 的方法是不够的,因为我需要能够向可能已经具有身份的 ClaimsPrincipal 添加身份。那么,如果您在 ClaimsPrincipal 中已有一个身份并声明一个新的 ClaimsPrincipal 实例,会发生什么呢?您现在是否有两个具有不同身份的 ClaimsPrincipal 实例?我的直觉是情况确实如此,所以我需要检查当前的 ClaimsPrincipal 是否存在并添加到它,如下所示:

ClaimsPrincipal principal;
if(System.Security.Claims.ClaimsPrincipal.Current != null)
{
   principal = System.Security.Claims.ClaimsPrincipal.Current;
   principal.AddIdentity(id)

}
else
{
   principal …
Run Code Online (Sandbox Code Playgroud)

c# authentication asp.net-mvc claims-based-identity wif

5
推荐指数
1
解决办法
6147
查看次数