Tag: 域驱动设计

有关C#的AOP建议

我有一个ASP.NET 3.5 SP1 Webforms应用程序。 我使用带有DI(autofac)的MVP模式(监督控制器)。 我的演示者调用我的域(DDD)中定义的存储库合同,这些合同在基础结构项目中实现。 演示者调用的存储库方法可以是hork,因此我需要记录exception,然后在View上设置错误消息。 在过去,我会在Presenter构造函数中添加另一个参数,将引用存储在Base Presenter中,并在Catch块中调用Log方法。 我真的不喜欢这个,但它完成了工作。 我可以使用工厂来获取此处所述的日志记录类,但我想首先探索AOP,因为它看起来非常有趣。 我已经完成了编译时与运行时AOP的阅读,我想知道人们对不同解决方案,优缺点,建议词等的经验。 从我所做的挖掘来看,似乎在.NET中有4个主要的AOP框架 温莎城堡 – 我一般都远离这个,因为它做了很多我真的不需要的东西 Spring.net – 听起来它有良好的记录,但通过其xml配置激发了恐惧(我不喜欢非流畅的配置) PostSharp – 属性驱动(我喜欢这个),但有一点有一些行号问题 ,不确定它们是否仍然存在 团结 – 我真的不需要很多东西 我看到另一个问题有一些好的答案,但是从一年半前开始。 是否有更新的,“更好”的框架在此期间开发,或者对现有解决方案的改进应该加以考虑? 作为参考,我选择了Autofac for DI,因为它流畅,易于使用,找不到任何关于它的负面评论,它只是有效。 是否有关于我应该尝试哪种AOP框架的建议? 感谢阅读所有这些并添加任何想法。

了解DDD上下文中的命令模式

我最近在这里阅读这篇文章: https : //cuttingedge.it/blogs/steven/pivot/entry.php?id = 100 。 它似乎谈论使用命令( http://www.dofactory.com/net/command-design-pattern )而不是应用程序服务。 请参阅以下代码: public sealed class ShipmentController { private readonly ICommandDispatcher dispatcher; public void ShipOrder(ShipOrder cmd) => dispatcher.Dispatch(cmd); } sealed class CommandDispatcher : ICommandDispatcher { private readonly Container container; public void Dispatch(dynamic cmd) => GetHandler(cmd.GetType()).Handle(cmd); private dynamic GetHandler(Type type) => container.GetInstance(typeof(ICommandHandler).MakeGenericType(type)); } 它取代了这样的代码: http : //www.zankavtaskin.com/2013/11/applied-domain-driven-design-ddd-part-6.html 我有三个问题: […]

域逻辑与数据validation

我正忙着阅读并享受Mark Seemann在.Net中的dependency injection。 我很难解释确切的背景,所以如果你熟悉这本书,请只关心这个问题。 我的问题与第2章第49页中的两个产品类有关。域层中有一个,数据访问层中有一个。 解释了数据访问层中的Product类是由Linq to Entity向导创建的。 我正在使用Linq to SQL,我可以使用Ling to SQL属性来装饰我的模型类,这样我就不必拥有第二个类。 例如 [Table(Name=”Customers”)] public class Customer { [Column(IsPrimaryKey=true)] public string CustomerID; [Column] public string City; } 但是我觉得这是混合问题,它实际上将我的域层紧密耦合到Linq to SQL数据访问层。 你同意吗? 假设我为域和数据访问层创建了两个“客户”类。 假设City是必填字段。 保存时,需要检查此规则。 这应该在域层或数据访问层中完成,还是两者都完成? 谢谢,达伦

entity framework和领域驱动设计

尝试使用EF和DDD设置一个简单的应用程序几天后,我不得不说我感到非常沮丧,并认为我最好使用Linq-to-SQL并忘记所有DDD和EF。 有了EF a)您不能拥有适当的只读集合 b)当您从子项集合中删除某些内容时,您经常会得到该关系无法更改该关系,因为一个或多个外键属性是不可为空的消息 c)没有简单的方法可以删除父项的所有子项并重新插入它们 鉴于我发现的解决方法非常令人讨厌,所有这些对我来说都是显而易见的。 有人设法组建了一个解决这些问题的简单存储库吗? 如果是的话,你是否愿意分享一些代码?!? 此外,我知道这是一个很大的话题,有没有人在大型Web应用程序中有任何实际DDD优势的经验? 我们都知道这个理论,但如果真的值得麻烦的话,想一个想法会很好! 好吧,到目前为止我能做的最好而不必做各种各样的漫游变通办法就是在我查询时使用AsNoTracking()。 这样我就得到了我的信息,而EF离开时却没有做任何背后的事情。 我现在可以从一个集合中删除,我也可以删除(谁会认为id必须回到sql!)有谁知道使用AsNoTracking的任何陷阱? 至于我可以根据我的对象生成SQL并填充它们或更新/删除它我很好。 整个跟踪事情无论如何都走得太远了? namespace EShop.Models.Repositories { public class CustomerRepository : BaseRepository, IRepository { public CustomerRepository() : base(new EShopData()) { } #region CoreMethods public void InsertOrUpdate(Customer customer) { if (customer.CustomerId > 0) { // you cannot use remove, if you do you ll attach […]

MVC和Observer模式

我在项目中实现Observer模式时遇到问题。 该项目必须在C#中作为MVC制作,就像Windows应用程序一样。 在我的域模型中,我有例如Country类和Country存储库。 我有一个国家/地区控制器和视图,可以查看所有国家/地区(表单上的列表),添加新国家/地区以及修改现有国家/地区。 我不知道有多少观点需要了解与改变国家有关的变化。 事情是我必须使用Observer模式。 在网络上,当主题为国家而观察者是一个正在编辑国家且所有示例都在控制台应用程序中的表格时,我只能找到检查。 我需要所有拥有国家名单的表格都知道添加新国家,而不仅仅是编辑现有国家。 如果我将存储库设为主题,我该怎么做呢?

DDD“查看对象”?

鉴于涉及公司的申请涉及公司,我可能会有公司类。 我将有一个填充List 的数据访问层。 但是,有时候(例如显示搜索结果)我只需要显示公司名称,电话和邮政编码属性,在我看来,填充整个Company对象及其所有属性似乎都是浪费。 在DDD设计方面,采用这种方法的正确方法是什么? 我是否会创建View特定的类,例如一个只暴露我感兴趣的属性的CompanySearchResult对象?

NHibernate IQueryable集合作为root的属性

我有一个根对象,其属性是一个集合。 例如: I have a Shelf object that has Books. // Now public class Shelf { public ICollection Books {get; set;} } // Want public class Shelf { public IQueryable Books {get;set;} } 我想要完成的是返回一个IQueryable的集合,这样我就可以直接从父节点运行分页和过滤集合。 var shelf = shelfRepository.Get(1); var filtered = from book in shelf.Books where book.Name == “The Great Gatsby” select book; 我希望NHibernate专门执行该查询,而不是全部加载整个集合然后在内存中解析它(这是当我使用ICollection时当前发生的事情)。 这背后的原因是我的collections可能是巨大的,成千上万的记录,并且所有查询都可以打击我的数据库。 […]

寻找域事件的示例

有没有人知道在哪里可以找到域事件实现的示例代码,如Udi Dahan在Domain Events – Salvation中所描述的那样?

使用属性validation

我有,比方说,这个简单的类: public class User { [Required(AllowEmptyStrings = false, ErrorMessage=”EmailIsRequired”] public string EmailAddress { get; set; } } 我知道如何在System.ComponentModel.DataAnnotations命名空间中使用Validator.TryValidateProperty和Validator.TryValidateObject。 为了使其工作,您需要要validation的对象的实际实例。 但是现在,我想要在没有User类实例的情况下validation某个值,例如: TryValidateValue(typeof(User), “EmailAddress”, “test@test.com”); 我的目标是在实际必须实例化对象本身之前测试一个值(原因是我只允许创建有效的域实体)。 所以实际上我想在类而不是实例上使用validation属性。 有什么想法可以做到吗? 谢谢! 编辑:同时我决定不使用数据注释,而是使用http://fluentvalidation.codeplex.com,以便validation移出实体之外。 这样,可以从实体内部以及我的命令处理程序中触发validation。 由于流利的符号,validation本身看起来更具可读性。

域驱动设计和entity framework4.1(代码优先)

我目前正在学习领域驱动的开发设计方法,并使用Tim McCarthy的.NET域驱动设计和C#书作为指南。 这本书真的很有帮助,但是在使用entity framework时,我变得有点不安,特别是4.1中提供的代码优先方法。 根据本书中的示例,分层体系结构方法应该意味着基础结构层无法看到模型/域。 那么在db上下文类中映射我的域poco的最佳方法是什么(我假设)应该位于基础结构层中,而不违反分层方法? 很有可能我的想法完全错了所以请告诉我,因为我还在学习! 非常感谢 :) 亚当