Tag: 域驱动设计

数据实体>域对象> ViewModels,每个都具有截然不同的数据结构

对于数据实体,域对象和ViewModel之间的映射,这是一个通用问题。 我可能不会问它,但希望我能理解它。 以下是一个简化的问题。 假设我有一个entity framework模型,它将1:1映射到我的数据库表,但我的域对象可能不相同,我的ViewModel再次完全不同。 作为一个伪示例: 数据库/ EF实体: MembershipAccount MembershipAccountExtraInfo 域: 帐户 轮廓 喜好 视图模型: UserProfileModel 假设我需要显示一个UserProfileModel,它具有:Username( 来自MembershipAccount ),SignupDate( 来自MembershipAccount ),FullName( 来自MembershipAccountExtraInfo )和TimeZone( 来自MembershipAccountExtraInfo ) 我可能需要什么样的关系,以及什么样的映射机制? 像AccountMapper这样的东西会同时接受MembershipAccount和MembershipAccountExtraInfo并返回一个帐户吗? 当需要几个对象来创建单个域实体时,我有点卡在映射上,反之亦然。 如果它有帮助:我正在设计一个用于管理用户帐户,用户配置文件,用户首选项等的API,但数据库表到处都是。 可能需要从跨越4-5个表和2个数据库的数据创建单个用户配置文件。 我的数据库表和任何(逻辑)域对象之间没有1:1映射。 谢谢!

entity framework:获取Repository中的Subclass对象

我有以下模型对应于下面列出的数据库表。 经理是员工。 会计师也是雇员。 获取存储库中所有管理器的最佳方法是什么? 如何实现GetAllManagers()方法? TPT是否合适? 码 MyRepository.MyEmployeeRepository rep = new MyEmployeeRepository(); List e = rep.GetAllEmployees(); public class MyEmployeeRepository { private string connectionStringVal; public MyEmployeeRepository() { SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.DataSource = “.”; sqlBuilder.InitialCatalog = “LibraryReservationSystem”; sqlBuilder.IntegratedSecurity = true; // Initialize the EntityConnectionStringBuilder. EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.Provider = “System.Data.SqlClient”; entityBuilder.ProviderConnectionString = sqlBuilder.ToString(); […]

基本综合问题

是否允许客户端代码引用不是根的聚合中的实体? 我有一个Story (根), Team (实体)和TeamMember (实体)。 我试图决定AddTeamMember方法是否属于Team或Story 。 我想我的例子有点误导。 我真正的问题是客户端代码可以引用聚合中的非根实体吗?

每个请求的上下文:如何更新实体

我有一个存储库类,如下所示。 有一种获取实体对象的方法 – GetPaymentByID。 我正在检索Payment对象并对其PaymentType属性进行更改。 但这并没有反映在数据库中。 我知道原因 – SaveContextChanges方法使用新的上下文。 我需要使用Context Per Request方法。 因此,我在每种方法中创建新的上下文。 在这种情况下,如何修改代码以成功更新数据库? 注意:客户端程序不应使用ObjectContext,因为可以使用不使用Entity Framework的另一个存储库更改存储库 。 注意 :“ DataContext很轻,创建起来并不昂贵 ” namespace MyRepository { public class MyPaymentRepository { private string connectionStringVal; public MyPaymentRepository() { SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.DataSource = “.”; sqlBuilder.InitialCatalog = “LibraryReservationSystem”; sqlBuilder.IntegratedSecurity = true; // Initialize the EntityConnectionStringBuilder. EntityConnectionStringBuilder entityBuilder = […]

是否有一个示例为什么应该在NHibernate中覆盖Equals / GetHashCode?

我发现很多post都解释说应该总是在NHibernate实体类上重写Equals / GetHashCode。 如果我不使用套装,这真的有必要吗? 我根本找不到一个示例,其中显示缺少Equals / GetHashCode会导致意外和错误的行为。 没有它们,一切似乎都很完美。 这是非常奇怪的,每个人都说这是必要的,但没有人可以提供一个样本,说明为什么需要这样做。

是一对一的关系糟糕的策略

用户总是有一个钱包。 一个钱包总是属于一个用户。 由于我想分离与钱包相关的属性,我创建了Wallet对象并能够跟踪货币交易,…我创建了 public Wallet : Entity { public double Amont {get; set;} public IList Transactions {get; set;} } 因为这显然是一对一的关系,所以可以使用一对一关系进行映射吗? 一对一的坏策略是什么?

为DDD中的实体生成标识

编辑 为了进一步澄清我最初的问题,我用更多的’DDD’ – 终点,常见模式和讨论论点重写了这个问题。 可以在修订版本中找到原始版本。 在正确应用DDD时,在域内生成实体 / 聚合根的身份的位置和方式? 我需要在创建或持久化时为我的实体分配唯一标识。 这些身份可以有多种风格 计算(基于实体的特征,因此基于业务要求) 自然的(基于一组规则,因此基于业务逻辑) 代理(基于随机生成的值,没有商业意义) 有许多方法可以生成和分配身份,从使用工厂创建身份,使用ORM授权到基础设施或数据库生成等。但是,如果正确应用DDD,身份应该在何处以及如何生成,考虑到我们不希望贫血领域模型和服务注入实体 ? 要求如上所述 没有贫血领域模型 没有dependency injection服务到实体 可能的方法 工厂 双重调度( 这可以用于身份生成吗? ) 在repositiories内生成 在基础设施内生成(例如ORM或数据库) 注入服务到实体

如果实体处于某种状态,如何强制执行约束(如任何字段(或特定字段))不得更改?

我正在尝试在我当前的项目中使用DDD(c#,mvc,nhibernate,castle),我正在考虑检查一个约束的最佳方法,即如果实体处于某种状态,则任何字段(或特定字段)都不得更改,即。 已预订的发票(州=已预订)不得更改金额字段。 在服务层我得到一些我需要映射到域对象的DTO对象(来自gui或web服务等)。 映射完成后,我想validation我的对象 – 特别是我想检查我的问题中的具体约束。 目前我在考虑: 跟踪实体级别的更改,即在每个setter添加字段到更改的字段集合,并切换NHibernate以使用字段访问策略。 如果不允许更改值,则此模式的变化是在setter上抛出exception 在映射之前创建对象的副本以及比较原始值和映射值 回到nhibernate并从nhibernate会话中获取此信息 – 但是规则将不会在实体级别强制执行(imho it break ddd) 你怎么看待这件事? 你知道这个有什么好的模式吗? 或者我错过了什么,我需要改变我对这种约束的思考方式? 在此先感谢您的帮助。

服务层(.NET应用程序)中的授权和用户信息

我目前正在使用.NET环境中的企业应用程序(n-layered),我想知道在BussinessLayer(BL)中管理身份validation/授权+数据过滤的最佳方法。 我们将使用来自多个接口(ASP.NET应用程序和Web服务)的BL,我认为我的ServiceLayer应该完成这项工作,但我找不到最好的方法。 我想它可能是这样的:(1)用户可能使用FormsAuthentication进行身份validation(ASP.NET Web客户端)。 (2)ASP .NET代码(Controller / CodeBehind)实例化服务以完成一些用户案例,以某种方式传递“用户”。 (3)服务方法检查“用户”是否存在(认证)和他的角色(授权)以validation他是否可以调用该方法。 如果未经过身份validation或授权,则会引发exception。 (4)服务使用存储库+其他服务+完成工作所需的任何服务。 如果需要某种细粒度过滤(例如,用户仅对某些项目具有权限),则服务会自动应用它。 我想要的是将ServiceLayer与’web stuff’隔离(不访问会话…),但是谁知道User调用其方法来正确操作。 此外,我不知道如何以良好的方式将该工作与ASP .NET身份validation相匹配……我正在考虑在服务ctor中总结“用户”,以便其方法具有所需的“上下文”,可以那工作?…我会很感激一些迹象或现有的代码片段。 谢谢您的帮助…

ASP.NET MVC2项目的DDD体系结构

我正在尝试使用域驱动开发(DDD)来实现我的新ASP.NET MVC2项目与entity framework4.在做了一些研究后,我想出了以下层约定,每个层都在自己的类项目中: MyCompany.Domain public class User { //Contains all the properties for the user entity } public interface IRepository where T : class { IQueryable GetQuery(); IQueryable GetAll(); IQueryable Find(Func condition); T Single(Func condition); T First(Func condition); T GetByID(int id); void Delete(T entity); void Add(T entity); void Attach(T entity); void SaveChanges(); } public interface […]