小编Aar*_*nHS的帖子

将CQRS命令直接传递给Domain对象

~TLDR:我正在为我的一个大型项目实现CQRS + DDD解决方案,我想知道是否有任何真正的原因导致我的命令处理程序无法直接将命令对象分配给我的聚合,在一个小的极少数情况下,命令对象数据丰富?我找不到任何具体的理由,为什么这会是任何一种反模式,我找不到任何有关这种类型设计的详细信息.

背景:之前我已经实现了CQRS系统,并且我已经实现了DDD应用程序,但在适当的Eric Evans样式域驱动的应用程序中从未实现过CQRS + DDD.所以我问,因为我不想滥用我的聚合物,并且长期伤害我的应用程序.

我的命令对象拥有相当多的数据的一个例子是一个注册命令,它接收8个以上的字段(名字,姓氏,首选名称,dob,标题,用户名,密码,部门等).在我的Aggregate上创建一个有8个参数的方法,并且使用某种dto的替代解决方案,让我的处理程序将命令映射到dto - 要么自动使用automapper,要么是内联的 - 感觉非常尴尬似乎是不必要的非增值抽象.

我还可以看到未来的用例,其中命令可能是数据丰富的(它不会占很大比例的命令,但仍然会有一些),所以我希望从一开始就让这个看似微不足道的方面正确.

domain-driven-design cqrs

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

是多个ninject绑定保证保持其绑定顺序

如果我注册:

Bind<IWeapon>().To<Sword>();
Bind<IWeapon>().To<Knife>();
Bind<IWeapon>().To<ChuckNorris>();
Run Code Online (Sandbox Code Playgroud)

然后检索通过:

IEnumerable<IWeapon> weapons = ServiceLocator.Current.GetAllInstances<IWeapon>();
Run Code Online (Sandbox Code Playgroud)

我保证绑定将始终以该顺序返回吗?

我尝试过,似乎确实如此,但这可能是偶然的.

c# dependency-injection ninject

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

由于循环范围回调引用而导致内存泄漏

今天我们在生产中发生了重大中断,内存从我们的网络服务器很快就消失了.这可以追溯到Ninject中的缓存机制(我认为它是激活缓存或其他东西 - 不完全确定).在调查问题之后,我们得出结论,我们在范围回调中有一个循环引用.

class View
{
    Presenter presenter;

    View()
    {
        //service locators are smelly, but webforms forces this uglyness
        this.presenter = ServiceLocator.Get<Func<View, Presenter>>()(this);

        this.presenter.InitUI();
    }
}

class Presenter
{
    CookieContainer cookieContainer;
    View view;

    Presenter(View view, CookieContainer cookieContainer)
    {
        this.view = view;
        this.cookieContainer = cookieContainer;
    }
}

class CookieContainer
{
    HttpRequest request;
    HttpResponse response; 

    CookieContainer()
    {
        this.request = HttpRequest.Current.Request;
        this.response = HttpRequest.Current.Response;
    }
}

Bind<Func<View, Presenter>>().ToMethod(ctx => view => 
        ctx.Kernel.Get<Presenter>(new ConstructorArgument("view", view)));

Bind<Presenter>().ToSelf().InTransientScope();
Bind<CookieContainer>().ToSelf().InRequestScope();
Run Code Online (Sandbox Code Playgroud)

这是导致问题的代码的表示.看起来发生了什么,CookieContainer的范围回调是HttpContext.Current,而CookieContainer也引用了HttpContext.Current.所以Ninject永远不会从其缓存中删除CookieContainer实例,因为CookieContainer实例保持其范围回调对象的活动.当我们将CookieContainer的范围更改为瞬态时,一切正常,正如我们预期的那样.但我仍然不能完全确定为什么会发生这种情况,因为看起来这是一个相当传统的做法呢?也许不是......

我也很困惑,因为我认为如果回调对象保持活着状态,那么Ninject不应该只从缓存中移回相同的实例,看到回调仍然存在,所以实例看起来应该是范围?为什么ninject会不断获取CookieContainer的新实例并缓存它们?我想还有其他问题与不正确的对象有关,但这至少只是一个错误,而不是内存泄漏.

我的问题是a)我们是否正确诊断出此错误?b)是否有建议的方法来避免再次发生这种情况?c)我可以在代码中加入修复以检查这种类型的循环依赖性(假设我们已经正确诊断了这个)吗?

c# dependency-injection ninject inversion-of-control circular-reference

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

c#bitarray正位的索引

我的ac#BitArray长度相当大(500,000),我试图得到数组中设置的所有正位的索引.目前我实现这一点:

public int[] GetIndexesForPositives()
{
    var idIndexes = new int[GetPositiveCount + 1];
    var idx = 0;
    for (var i = 0; i < Length; i++)
        {
            if (Get(i))
            {
                idIndexes[idx++] = i;
            }
        }
    return idIndexes;
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个已知正位大小的空数组,然后我在bitarray上进行lopp并将索引值添加到返回数组中.

这意味着我必须在阵列上执行500,000次循环,而且速度并不快.(大约需要15ms).

我知道BitArray在封面下使用了一个整数数组(我用它来编写GetPositiveCount函数 - 通过我从堆栈中得到的算法),我想知道是否还有一个algorythm这样做呢?

c# algorithm performance

6
推荐指数
2
解决办法
3275
查看次数

git wildcard - 删除子目录的所有实例

我试图执行git rm --cached -r <folder>以递归方式删除名为.svn的文件夹的所有实例.我试过这个:

.svn
/.svn
/*/.svn
/*/*/.svn

etc 
Run Code Online (Sandbox Code Playgroud)

它有效,但我确信有一种更有活力的方式.

谢谢

git version-control find

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

在mvc 2中测试自定义actionresult

我有一个覆盖Execute的actionresult(正如你所做的那样),actionresult基本上接收一个模型,序列化它,并通过response.write(模型为文本)将其写入响应.

我做了一些环顾四周,我不能看到一个简单的方法来测试响应是正确的.我认为最好的方法是测试实例化自定义actionresult和模型,调用execute方法,然后有些人检查controllercontexts的响应.唯一的问题是,如何将响应输出作为字符串?我在某处读到你不能将响应输出流作为文本?如果是这样,我如何验证我的内容是否被写入响应流?我可以测试我的序列化程序以降低风险,但是想知道如何覆盖ExecuteResult覆盖...

public class CustomResult: ActionResult
    {

        private readonly object _contentModel;
        private readonly ContentType _defaultContentType;

        public CustomResult(object contentModel, ContentType defaultContentType)
        {
            _contentModel = contentModel;
            _defaultContentType = defaultContentType;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            context.HttpContext.Response.Write(serialized model);
        }

    } 
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc unit-testing

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

在 CQRS 中处理大量非规范化读取模型更新

我正在设计一个 CQRS 事件源系统(不是我的第一个),其中我的读取模型被非规范化并存储在读取优化的文档数据库 (MongoDb) 中。没什么特别的。现在这个特定的读取模型是一个包含用户 ID 和用户所属的潜在大型组数组的文档:

{
  "userId": 1,
  "userName": "aaron",
  "groups": [
    {
      "groupId": 1,
      "name": "group 1"
    },
    {
      "groupId": 2,
      "name": "group 2"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

可能有成千上万的用户是一个组的成员(举个例子:想象一个每个工作人员都是成员的组)。

请记住,我首先使用 CQRS 的原因是我需要扩展我的读取(或者更确切地说,鉴于需要避免大量连接,以不同方式处理我的读取),并且我期待大量写道。这不是我使用 CQRS 和事件溯源的唯一原因,但它是一个主要的催化剂。

现在我遇到的问题是当有人更新组名时(我预测这会经常发生)我的读取模型需要更新。这意味着单个用户对单个数据的修改将在我的读取存储中导致成千上万的更新。

我很清楚我可以应用的所有技术来处理调度更新以避免时间耦合,但是我担心每个用户修改将更新的文档数量

我已经阅读了几个问这种确切类型问题的 SO 答案,大多数答案表明您要么需要取得平衡,要么不必担心大规模更新。但是 IMO,这不是一个真正的选择。在这种类型的读取模型中确实没有平衡(任何对文档的重新建模仍然需要组名出现同样多次,无论它如何重新建模),并且简单地接受大量更新对于超快速读取存储的想法会适得其反,因为由于几乎总是在进行的持续更新,它现在将承受严重的负载要排队。本质上会发生什么,是非规范化过程将成为瓶颈,并且队列将随着时间的推移而增长(直到用户更新组名有一些喘息的机会),并且读取将变得缓慢作为副作用。

在有人跳到我身上问我是否知道这个瓶颈会发生之前,答案是“应该,但显然我不能确定”。但是,基于知道在我要替换的现有系统中进行了多少更改,并且请记住,这不是文档数据库中唯一需要更新的模型类型,我有充分的理由担心. 正如我所说,还有其他几种读取模型——它们可能没有相同数量的更新——但仍然会增加读取存储中的写入负载。而且,读取存储只能进行如此多的写入。

我可以想到两种解决方案(一种愚蠢,一种不那么愚蠢):

  1. 在每个文档中存储一个版本,并且在事件发生时更新读取模型。然后,当读取特定文档时,我会检查是否过时,如果版本过时(由于执行命令),我会在存储和返回该文档之前对该文档应用最后一次更改。然而,我的直觉告诉我,不管怎样,最终每个文档都会得到更新,这只是给读取增加了额外的开销。我也不知道版本控制实际上是如何工作的

  2. 使用关系读取模型并具有单个连接。这似乎是最明智的选择,因为我只会更新连接表,一切都很好。但是读取不会那么快,而且感觉比纯 select * from tablename 方法要差一些。

我的问题:

是否有任何标准技术可以解决此类问题?我提供的第二个选项是我所能希望的最好的选择吗?

老实说,我原以为这种类型的问题会一直发生在 CQRS 事件源系统中,其中非规范化数据需要保持同步,但社区中似乎缺乏关于它的讨论,这导致我相信我错过了一个明显的解决方案,或者我的阅读模型需要改进。

mongodb cqrs event-sourcing

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

使用代码体中声明的具体类的单元测试类

很简单,我想找出的是,是否有任何方法可以干净地对这段代码进行单元测试?我可以实例化它并运行一些断言,但我的意思是实际的单元测试,我将模拟服务对象以删除被测类的任何依赖性,并且实际上让它仅测试此类而不测试其依赖的服务(在本例中为 ConcreteService)。

public class Foo{

    public SomeResult DoSomething(){
        var service = new ConcreteService();
        var foo = service.Execute();
        return foo;
    }

}
Run Code Online (Sandbox Code Playgroud)

我的正常方法是不在我的代码主体中创建这种类型的对象,但是考虑到无法更改此对象的情况,我对它进行单元测试的选项是什么?

.net c# unit-testing dependency-injection

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