小编Mic*_*tov的帖子

使用DDD创建子实体的正确方法

我是DDD世界的新手,在阅读了几本关于它的书之后(其中包括Evans DDD)我无法在互联网上找到我的问题的答案:用DDD创建子实体的正确方法是什么?你看,互联网上的很多信息都在一些简单的层面上运作.但是细节上的恶魔并没有为了简单起见而在数十个DDD样本中省略它们.

我在stackoverflow 上来自我自己在similair问题上的回答.我对这个问题的看法并不完全满意,所以我想我需要详细说明这个问题.

例如,我需要创建代表汽车命名的简单模型:公司,模型和修改(例如,日产天籁2012 - 将是"日产"公司,"天籁"模型和"2012"修改).

我想要创建的模型的草图如下所示:

CarsCompany
{
    Name
    (child entities) Models
}

CarsModel
{
    (parent entity) Company
    Name
    (child entities) Modifications
}


CarsModification
{
    (parent entity) Model
    Name
}
Run Code Online (Sandbox Code Playgroud)

所以,现在我需要创建代码.我将使用C#作为语言,将NHibernate用作ORM.这很重要,通常在互联网上的大量DDD样本中没有显示.

第一种方法.

我将从通过工厂方法创建典型对象的简单方法开始.

public class CarsCompany
{
    public virtual string Name { get; protected set; }
    public virtual IEnumerable<CarsModel> Models { get { return new ImmutableSet<CarsModel> (this._models); } }


    private readonly ISet<CarsModel> _models = new HashedSet<CarsModel> ();


    protected CarsCompany ()
    {
    }


    public static …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate domain-driven-design parent-child

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

具有有界容量的变换块中的TPL数据流异常

我需要构建TPL数据流管道,它将处理大量消息.因为有很多消息我不能简单地将Post它们放入无限队列中,BufferBlock否则我将面临内存问题.所以我想使用BoundedCapacity = 1选项来禁用队列并使用MaxDegreeOfParallelism并行任务处理,因为我的TransformBlocks可能需要一些时间来处理每条消息.我也用来PropagateCompletion完成所有的完成并且无法沿管道向下传播.

但是我正面临着错误处理的问题,当错误发生在第一条消息之后:调用await SendAsync只是将我的应用程序切换到无限等待.

我已将我的案例简化为示例控制台应用程序:

var data_buffer = new BufferBlock<int> (new DataflowBlockOptions
                                        {
                                            BoundedCapacity = 1
                                        });

var process_block = new ActionBlock<int> (x => { throw new InvalidOperationException (); },
                                            new ExecutionDataflowBlockOptions
                                            {
                                                MaxDegreeOfParallelism = 2,
                                                BoundedCapacity = 1
                                            });

data_buffer.LinkTo (process_block, new DataflowLinkOptions { PropagateCompletion = true });


for (var k = 1; k <= 5; k++)
{
    await data_buffer.SendAsync (k);
    Console.WriteLine ("Send: {0}", …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library tpl-dataflow

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

将数据流拆分为小作业,然后再进行分组

我需要做这样的工作:

  1. 从数据库中获取Page对象
  2. 为每个页面获取所有图像并处理它们(IO绑定,例如,上传到CDN)
  3. 如果所有图像都成功完成,则将页面标记为在数据库中处理

由于我需要控制并行处理的页数,我决定使用TPL数据流:

 ____________________________
|         Data pipe          |
|   BufferBlock<Page>        |
|   BoundedCapacity = 1      |
|____________________________|
              |
 ____________________________
|       Process images       |
| TransformBlock<Page, Page> |
| BoundedCapacity = 1        |
| MaxDegreeOfParallelism = 8 |
|____________________________|
              |
 ____________________________
|        Save page           |
| ActionBlock<Page>          |
| BoundedCapacity = 1        |
| MaxDegreeOfParallelism = 5 |
|____________________________|
Run Code Online (Sandbox Code Playgroud)

现在我需要"过程图像"来并行处理图像,但我想限制我在当前工作中所有并行页面上处理的图像数量.

我可以将TrasnformManyBlock用于"过程图像",但如何在"保存页面"块中将它们收回?

         ____________________________
        |         Data pipe          |
        |   BufferBlock<Page>        |
        |   BoundedCapacity = 1      |
        |____________________________|
                      |
     ___________________________________
    |           Load …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library tpl-dataflow

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

具有BoundedCapacity的BufferBlock和ActionBlock不使用max DOP

我有这个代码:

var data = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });

var action = new ActionBlock<int>(async id =>
{
    Console.WriteLine("[{0:T}] #{1}: Start", DateTime.Now, id);

    await Task.Delay(1000);

    Console.WriteLine("[{0:T}] #{1}: End", DateTime.Now, id);
}, new ExecutionDataflowBlockOptions
{
    BoundedCapacity = 1,
    MaxDegreeOfParallelism = -1
});

data.LinkTo(action, new DataflowLinkOptions { PropagateCompletion = true });

for (var id = 1; id <= 3; id++)
{
    Console.WriteLine("[{0:T}] Sending {1}", DateTime.Now, id);
    data.SendAsync(id).Wait();
    Console.WriteLine("[{0:T}] Sending {1} complete", DateTime.Now, id);
}

data.Complete();

Task.WhenAll(data.Completion, action.Completion).Wait();
Run Code Online (Sandbox Code Playgroud)

这段代码得到了我的输出:

[22:31:22] Sending …
Run Code Online (Sandbox Code Playgroud)

.net c# task-parallel-library async-await tpl-dataflow

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