Tag: 域驱动设计

洋葱建筑中的典型层次是什么?

我目前正在研究域驱动设计,并尝试将其应用于WPF项目。 我观看了一些教程video,并阅读了很多文章,例如: 同一层中的洋葱架构依赖关系:基础架构和Web通信 http://eohmicrosoft.blogspot.fr/2012/08/laying-it-out-onion-architecture.html 域驱动设计:域服务,应用服务 我理解对接口和控制反转的关注。 我读到有一些经常出现的层名(领域/核心用于表示知识领域,基础设施用于持久性,应用程序用于……我不明白),但它们会根据我阅读的文章而改变。 有些人甚至没有出现。 是否有可能拥有一个理论上在洋葱架构中需要面对所有需求和问题的所有层的列表,它们的意图(它们包含什么样的代码,它们试图满足什么样的需要) ,他们需要参考哪一层),好吗?

重构代码以避免类型转换

我在.Net 4.0中有以下C#代码。 它需要对IRetailBusiness进行IBusiness的类型转换。 //Type checking if (bus is IRetailBusiness) { //Type casting investmentReturns.Add(new RetailInvestmentReturn((IRetailBusiness)bus)); } if (bus is IIntellectualRights) { investmentReturns.Add(new IntellectualRightsInvestmentReturn((IIntellectualRights)bus)); } 业务场景: 我正在为投资控股公司设计软件系统。 该公司拥有零售业务和IntellectualRights业务。 BookShop和AudioCDShop是零售业务的例子。 EngineDesignPatent和BenzolMedicinePatent是IntellectualRights业务的例子。 这两种业务类型完全不相关。 这家投资公司有一个名为InvestmentReturn的概念(但每个企业对这个概念都完全无知)。 InvestmentReturn是从每个业务获得的利润,并使用ProfitElement进行ProfitElement 。 对于每种“业务类型”(Retail,IntellectualRights),使用的ProfitElement是不同的。 题 如何重构此类设计以避免此type casting和type checking ? 摘要投资 public abstract class InvestmentReturn { public double ProfitElement { get; set; } public IBusiness Business{ get; […]

优化存储库的SubmitChanges方法

我有以下存储库。 我使用工厂在LINQ 2 SQL生成的类和域对象之间进行映射。 以下代码将起作用; 但我看到两个潜在的问题 1)它在更新语句之前使用SELECT查询。 2)它需要更新所有列(不仅是更改的列)。 这是因为我们不知道域对象中所有列的更改。 如何克服这些缺点? 注意:可能存在基于特定列更新执行的方案(如触发器)。 所以我不能不必要地更新列。 参考 : LINQ to SQL:“UpdateCheck = Never”时不刷新更新 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=113917 码 namespace RepositoryLayer { public interface ILijosBankRepository { void SubmitChangesForEntity(); } public class LijosSimpleBankRepository : ILijosBankRepository { private IBankAccountFactory bankFactory = new MySimpleBankAccountFactory(); public System.Data.Linq.DataContext Context { get; set; } public virtual void SubmitChangesForEntity(DomainEntitiesForBank.IBankAccount iBankAcc) […]

POCO,行为和持久性无知

从我所读到的POCO类应该是持久性无知,不应该包含对存储库的引用。 Q1。 鉴于上述情况,我将如何填充QuestionBlocks集合? 我已经读过,POCO应该包含行为,所以你不要以贫血模型结束,所以我有点困惑,因为如果没有持久性,应该如何做到这一点。 如果是这样的话,你会把什么样的行为放在POCO中? 例如: public class Survey { public int SurveyId { get; set; } public string Title { get; set; } public int BrandId { get; set; } public DateTime Created { get; set; } public List QuestionBlocks { get; set; } [ResultColumn] public string Name { get; set; } /// /// […]

一个事务中的多个聚合/存储库

我有一个支付系统,如下所示。 付款可以通过多个礼券进行。 礼品券与购买一起发行。 客户可以使用此礼品券以备将来购买。 当通过礼品券进行付款时,GiftCoupon表中的UsedForPaymentID列需要使用该PaymentID(对于礼品券ID)进行更新。 GiftCouponID已在数据库中提供。 当客户生产礼品券时,其上印有GiftCouponID。 运营商需要将此CouponID输入系统以进行付款。 对于MakePayment()操作,它需要两个存储库。 礼品券库 付款存储库 码 //使用GiftCouponRepository检索相应的GiftCoupon对象。 这涉及为一个事务使用两个存储库。 这是一个好习惯吗? 如果没有,我们如何改变设计来克服这个问题呢? 参考 :在DDD中,Aggregate应代表事务边界。 需要涉及多个聚合的交易通常表明应该改进模型,或者应该审查交易要求,或者两者兼而有之。 CQRS对我的域名是否正确? C#代码 public RepositoryLayer.ILijosPaymentRepository repository { get; set; } public void MakePayment(int giftCouponID) { DBML_Project.Payment paymentEntity = new DBML_Project.Payment(); paymentEntity.PaymentID = 1; DBML_Project.GiftCoupon giftCouponObj; //Use GiftCouponRepository to retrieve the corresponding GiftCoupon object. paymentEntity.GiftCouponPayments = new System.Data.Linq.EntitySet(); […]

如何将当前用户信息传递给DDD中的所有图层

以前曾问过类似的问题,但不完全相同(除非我错过了) 我想通过我的服务,域,域事件,域事件处理程序传递IUserInfo类实例… 什么是最好的方法。 我是不是该 使用IoC通过将其注册到Httpcontext.Current.session [“CurrentUser”]的实例来注入它; 将数据添加到当前线程。 任何其他方式 我被困在域事件处理程序中,我希望将数据用于审计以及发送电子邮件。 我希望能够在我的应用程序中的任何位置使用CurrentUser信息。 随着线程被合并的线程,我怀疑线程的重用是否会重置数据。 如果没有,请告诉我如何使用线程传递IUser实例。 问候, 损伤