小编mat*_*i82的帖子

如何在DDD模式的.NET企业应用程序中正确定义异常策略?

我正在使用DDD模式开发类似企业的项目.我在C#解决方案中有以下项目:

  • 域模型 - DLL项目

  • WebUI - ASP.NET MVC3项目

  • DesktopUI - WPF项目

  • DAL - 实体框架代码优先

  • 持久性 - SQL Server数据库

这个项目并不大,但我正在尝试使用企业应用程序的所有良好实践.

我现在要定义的是异常策略,但我不确定如何处理它.我应该使用企业库异常处理和记录块,但我不知道如何将其纳入图片.我想在脑海中解决的一些具体情况如下:

  • 如果用户在WPF应用程序中创建了新实体,并且单击了"保存"按钮,则如果在不同级别发生异常(例如,根据域规则未正确创建实体,或者存在尝试将新对象持久保存到数据库时出错

  • 用户尝试从数据库中检索未知实体(例如,通过在URL中指定未知实体Id从WebUI中检索)

我知道我可以定义自定义异常,但我不确定在何处和如何.它们应该按每层定义吗?我知道有包装异常练习但又不太确定如何最好地使用该模式.

我也应该为某个层中的每个错误创建一个自定义异常(例如,UserAlreadyExistInDatabaseException尝试使用相同的电子邮件保存两个用户,如果尝试从DB中获取未知用户则为UnknownUserDatabaseException),或者我应该有一个处理多个层错误的异常类型(例如,DatabaseException,然后使用自定义属性或Exception.Message属性区分错误).

.net enterprise domain-driven-design exception

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

在实施IEnlistmentNotification时我应该在哪里执行操作?

我试图通过实现IEnlistmentNotification接口创建自定义"资源管理器" .该接口有以下方法:

  • 准备()
  • 承诺()
  • 回滚()
  • 怀疑()

虽然很清楚回滚代码应该在Rollback()方法中,但我不确定在哪种方法中应该实现执行实际操作的代码?它应该在Prepare()或Commit()中,还是在类中的一些其他自定义方法中,这些方法将从TransactionScope块内部的外部代码中调用?

.net c# transactions transactionscope

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

我应该触发触发器来改变有限状态机中的OnEntry()方法的状态吗?

我正在使用无状态框架(https://code.google.com/p/stateless/)在我的应用程序中建模有限状态机.某些状态应该执行某些逻辑,然后立即进入下一个状态.我想知道这样做的好习惯如下:

            var machine = new StateMachine<State, Trigger>(State.Idle);
            machine.Configure(State.StateA)
            .OnEntry(() =>
            {
                DoSomeStuff();
               _machine.Fire(Trigger.TriggerB);     // move to StateB
            });
Run Code Online (Sandbox Code Playgroud)

这是一个很好的FSM设计吗?如果没有,那会有什么更好的方法?我试图实现的想法是让某些状态自动将机器推进到下一个状态,而不需要等待DoSomeStuff()完成然后触发机器在下一个状态下移动的外部代码.

.net c# state-machine stateless-state-machine

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

如何构造函数 - 注入仅在运行时已知的字符串?(温莎城堡)

我有一个依赖于字符串的类:

public class Person
{
    private readonly string _name;

    public Person(string name)
    {
        if (name == null) throw new ArgumentNullException("name");
        _name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

该字符串'name'仅在运行时才知道,例如.它在配置中定义.所以我有这个提供这个字符串的接口:

public interface IConfiguration
{
    string Name { get; }
}
Run Code Online (Sandbox Code Playgroud)

这两种类型,Person和IConfiguration(其实现在这里并不重要)都在Windsor容器中注册.

问题:如何告诉WindsorCastle容器它应该将IConfiguration的Name属性注入Person类的构造函数?

警告:我不想将IConfiguration注入Person类或使用类型化的工厂...... Person类必须简单并且只接受字符串作为参数.

.net c# dependency-injection castle-windsor inversion-of-control

4
推荐指数
1
解决办法
1892
查看次数

如何在一个地方定义x:资源键并在XAML和后面的代码中使用它

标题中的问题几乎总结了一下.我在XAML中定义了一些资源对象,我也想在后面的代码中访问它.那么有没有办法在一个地方定义x:Key而不是硬编码x:XAML和后面的代码中的Key(作为字符串)?

wpf resources xaml

3
推荐指数
1
解决办法
3104
查看次数

我应该处理工厂模式类中的异常还是让它们向上传播?

我是C#开发人员,我想使用工厂模式来创建表示硬盘上的文件或目录的对象.FileInfo和DirectoryInfo是用于此目的的.NET中的类,但是我想拥有自己的包含它们的IFileInfo和IDirectoryInfo接口而不是它们.使用自定义接口而不是内置类的原因是因为我想添加一些其他属性,如文件shell图标等...

所以我想使用工厂模式为文件/目录路径的给定字符串创建IFileInfo和IDirectoryInfo的实例.

所以工厂类看起来像:

public class MyFileInfoFactory
{
    IFileInfo Create(string filePath)
    {
        System.IO.FileInfo file = new System.IO.FileInfo(filePath);

        // turn FileInfo to my IFileInfo etc...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在看一下System.IO.FileInfo文档(FileInfo MSDN),我看到有几种可能的异常可以抛出.我的问题是我应该在工厂Create()方法中处理所有这些异常吗?或者我应该让它们向上传播到调用MyFileInfoFactory.Create()的代码?

如果第一个解决方案是可行的,那么下一步将是什么?例如,我应该返回null还是可能抛出一些自定义异常,并将InnerException属性设置为从新FileInfo()构造函数抛出的实际异常?

只是想知道在这个具体情景案例中最佳做法是什么......

.net c# design-patterns factory fileinfo

3
推荐指数
1
解决办法
1503
查看次数

为什么路由器使用正常功能而不是快速4.x中的构造函数?

我是新手试图了解Express 4.x路由,我正在阅读他们的指南:http://expressjs.com/guide/routing.html

在最后一段中,它说:

express.Router类可用于创建模块化可安装路由处理程序.路由器实例是一个完整的中间件和路由系统

和随附的代码是:

var express = require('express');
var router = express.Router();
Run Code Online (Sandbox Code Playgroud)

为什么这个express.Router构造函数在没有new运算符的情况下调用普通函数?他们在文档中说它是一个类,他们根据javascript样式(大写第一个字母)命名它,但是它们(以及所有其他在线示例)将它用作普通函数.

javascript url-routing node.js express

3
推荐指数
1
解决办法
417
查看次数

如何在 Vuetify v-calendar 中以每周模式显示每天的特定时间范围?

在 Vuetify周历示例中,每一天都显示为包含完整 24 小时的列。是否可以限制此范围并仅显示每天的某些时间?例如。仅显示上午 9 点至下午 17 点的时间(每天的典型工作时间)。这将减少日历在屏幕上的整体高度并且更加清晰,但我找不到如何做到这一点的方法。

vue.js vuetify.js

3
推荐指数
1
解决办法
4055
查看次数

DDD:对具有两个聚合根的简单域进行建模

假设我要创建一个行动网站,会员可以在其中竞标物品。为了对此域建模,我有三个类:成员,项目和出价。我的头脑风暴将是这样的:

  • 项目可以包含多个出价
  • 出价与一个项目和一个成员相关联
  • 会员可以包含多个出价
  • 成员和项目可以不存在出价实例而存在
  • 没有Member和Item的竞价实例将不存在

考虑到所有这些,很明显,由于Member和Item对象是独立的,因此我们可以认为它们是集合根。出价将是其中一项的一部分。很明显,但是现在让我感到困惑的是,我应该选择哪个聚合根?项目或会员?

这是Apress的Pro ASP.NET MVC 3 Framework书中的示例,其执行方式如下所示:

在此处输入图片说明

给出以下代码:

public class Member 
{
    public string LoginName { get; set; } // The unique key
    public int ReputationPoints { get; set; }
}

public class Item 
{
    public int ItemID { get; private set; } // The unique key
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime AuctionEndDate { get; set; }
    public IList<Bid> Bids { get; set; } …
Run Code Online (Sandbox Code Playgroud)

domain-driven-design aggregate root

2
推荐指数
1
解决办法
709
查看次数

是否将克隆区域克隆为git clone的一部分?

假设DeveloperA在git存储库(在他的计算机上本地)上运行,并且还有一些文件在下一次提交的索引中暂存.如果DeveloperB然后通过"git clone"命令克隆此存储库,他是否还将从developerA的存储库中接收暂存区域的内容?

git git-clone

2
推荐指数
1
解决办法
172
查看次数

在存储库模式中使用IQueryable <T>的替代方法是什么?

我是ASP.NET MVC新手(但.NET经验丰富的开发者),我正在努力学习如何正确设置Web应用程序基础结构.存储库模式是我现在正在考虑的,在过去几天阅读了几十篇博客/文章/答案后,我仍然不确定如何以正确的方式使用它.我正在学习Pro ASP.NET MVC 4 Adam Freeman,这里是基于本书的存储库接口代码:

public interface IRepository<T>
{
    IQueryable<T> FindAll();
    IQueryable<T> Find(Expression<Func<T, bool>> predicate);

    void Add(T newEntity);
    void Remove(T entity);

    T FindById(long id);
}
Run Code Online (Sandbox Code Playgroud)

经过更多的在线研究,我意识到许多人认为从存储库中返回IQueryable是不好的做法,我(大多数时候)可以理解为什么.但是,我似乎无法找到具体替代方案的答案?我知道有一个自定义存储库的想法,对于每个实体,每个可能的查询都有专门的方法,基本上会返回IEnumerable而不是IQueryable ......但这对我来说似乎不对(它也不是优雅的解决方案)许多代码编写和可能的代码冗余等...).

还有什么其他选择?

entity-framework iqueryable repository-pattern

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