我是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) 我需要构建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) 我需要做这样的工作:
由于我需要控制并行处理的页数,我决定使用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) 我有这个代码:
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)