Tag: repository pattern

DDD:持久化之前的实体身份

在域驱动设计中,实体的一个定义特征是它具有身份。 问题: 我无法在实例创建时为实体提供唯一标识。 一旦实体被持久化(此值由底层数据库提供),此标识仅由存储库提供。 此时我无法开始使用Guid值。 现有数据与int主键值一起存储,我无法在实例化时生成唯一的int。 我的解决方案 每个实体都有一个标识值 一旦持久化(由数据库提供),身份仅设置为真实身份 在持久性之前实例化时,标识设置为默认值 如果标识是默认标识,则实体可通过引用进行比较 如果标识不是默认标识,则实体可通过标识值进行比较 代码(所有实体的抽象基类): public abstract class Entity { private readonly IdType uniqueId; public IdType Id { get { return uniqueId; } } public Entity() { uniqueId = default(IdType); } public Entity(IdType id) { if (object.Equals(id, default(IdType))) { throw new ArgumentException(“The Id of a Domain Model […]

工作单元和存储库模式对大型项目非常有用吗?

我正在使用ASP.NET Webforms + EF4开始一个新的Web项目。 我正在尝试按照本教程应用具有工作单元模式的存储库模式: http : //www.dotnetage.com/publishing/home/2011/07/05/6883/the-repository-pattern-with-ef -code先dependeny喷射在-ASP净mvc3.html 我想我有了这个想法,但我的问题是,当我在模型中创建一个新对象时,我是否还必须在工作单元的IDALContext中定义该对象? 这不是一个快速发展的手? 此外,如果您与多个开发人员合作,并且如果您不希望其他开发人员看到您的DAL,您如何管理它? 因为在我理解的这种模式中,当你在模型中创建一个新对象时,你还必须在本教程的IDALContext中定义它。 对不起,我对此很困惑。

如何从存储库中检索域对象

我对存储库域对象关系有一点了解。 以下是我对域名设计所了解的一些信息(它们可能也是错误的或不准确的)。 考虑到这些,我找不到从存储库中获取域对象的方法。 在DDD中,域名应该只知道并包含业务所需的内容,其他所有内容都必须从域中清除。 没关系。 而且,从任何企业抽象数据访问也是一种很好的做法。 应用程序不需要知道我们存储数据的位置或存储数据的方式。 我们只要求存储库给我们一个域对象,它为我们提供了我们想要的对象,或者另一种方式也是有效的,我们给存储库一个域对象并将其发送到存储。 在面向对象设计中声明域对象的公共setter也是一种非常糟糕的方法,因为我们无法控制谁访问了什么并改变了什么。 因此,仅展示对象外部所需的内容是一种很好的做法。 因此,在我的脑海中,我无法找到实现我的存储库的方法。 我可以在我的代码中使用任何ORM或纯sql并检索数据。 但我无法从持久性对象创建域对象; 由于他们没有公共设置器,我无​​法创建和设置字段值。 声明包含所有字段的公共构造函数似乎不正确。 我可能有几个模型要填写,这意味着我必须定义几个具有不同参数集的构造函数。 任何帮助将不胜感激…

实现死锁exception的重试逻辑

我已经实现了一个通用存储库,并想知道是否有一种智能方法可以在出现死锁exception的情况下实现重试逻辑? 对于所有存储库方法,该方法应该相同。 那么无论如何我可以避免在每一种方法中使用retry-count再次编写’try / catch – call方法’吗? 任何建议都是受欢迎的。 我的存储库代码: public class GenericRepository : IRepository { private ObjectContext _context; public List ExecuteStoreQuery(string commandText, params object[] parameters) where TEntity : class { List myList = new List(); var groupData = _context.ExecuteStoreQuery(commandText, parameters); return myList; } public IQueryable GetQuery() where TEntity : class { var entityName = GetEntityName(); […]

C#如何将Expression <Func >转换为Expression <Func >

我之前使用过基于lamdas的C#表达式,但我没有手工编写它们的经验。 给定一个Expression<Func> originalPredicate ,我想创建一个Expression<Func> translatedPredicate 。 在这种情况下,SomeType和OtherType具有相同的字段,但它们不相关(没有inheritance而不是基于公共接口)。 背景:我有一个基于LINQ to SQL的存储库实现。 我将LINQ to SQL实体投影到我的Model实体,以便将我的模型保存在POCO中。 我想将表达式传递给存储库(作为规范的一种forms),但它们应该基于模型实体。 但我无法将这些表达式传递给数据上下文,因为它需要基于LINQ to SQL实体的表达式。

DDD – 如何实现高性能的搜索存储库

我有关于DDD和存储库模式的问题。 假设我有Customer聚合根的Customer存储库。 Get&Find方法返回完全填充的聚合,其中包括Address等对象。一切都很好。 但是当用户在UI中搜索客户时,我只需要聚合的“摘要” – 只是一个包含汇总信息的扁平对象。 我可以解决这个问题的一种方法是正常调用存储库中的find方法,然后在应用程序层中将每个客户聚合映射到CustomerSearchResult / CustomerInfo DTO,并将它们发送回客户端。 但我的问题是性能; 每个Customer聚合可能需要多个查询来填充所有关联。 因此,如果我的搜索条件与50个客户相匹配,那么对于可能检索数据的数据库而言,这是我非常不需要的。 另一个问题是,我可能希望包含有关客户聚合根边界之外的客户的汇总数据,例如最后订单的日期。 订单有自己的聚合,因此要获取客户的订单信息,我必须调用OrderRepository,这也会降低性能。 所以现在我觉得我有两种选择: 向CustomerRepository添加一个额外的Find方法,该方法通过执行一个有效的查询来返回这些摘要对象的列表。 创建一个专门构建的只读CustomerInfoRepository,它只有1中描述的find方法。 但这两种感觉都让我觉得我违背了DDD的原则。 我的存储库inheritance自通用基础:存储库,其中T:IAggregateRoot。 这些摘要信息对象不是聚合,并且与T的类型不同,所以#1真的违背了设计。 也许对于#2,我会创建一个没有IAggregateRoot约束的抽象SearchRepository? 我的域名中有许多类似的场景。 你会如何实现这种情况? 谢谢,戴夫 更新 在阅读Theo的答案之后,我想我会选择#2选项并在我的基础架构中创建一个专门针对这些场景的SearchRepository。 然后,应用程序层(WCF服务)可以调用这些直接填充摘要DTO的存储库,而不是将域实体映射到DTO。 ****更新2 **** 虽然我在一年前问过这个问题,但我想我只是补充一点,因为我发现了CQRS,旨在解决这个问题。 Udi Dahan( http://www.udidahan.com/ )和Greg Young( http://codebetter.com/gregyoung/ )已经写了很多关于它的文章。 如果您使用DDD创建分布式应用程序,CQRS适合您!

洋葱架构,工作单元和通用存储库模式

这是我第一次实施更多以域驱动的设计方法。 我决定尝试使用Onion Architecture,因为它专注于域而不是基础架构/平台/等。 为了从entity framework中抽象出来,我创建了一个带有工作单元实现的通用存储库 。 IRepository和IUnitOfWork接口: public interface IRepository { void Add(T item); void Remove(T item); IQueryable Query(); } public interface IUnitOfWork : IDisposable { void SaveChanges(); } IRepository和IUnitOfWorkentity framework实现: public class EntityFrameworkRepository : IRepository where T : class { private readonly DbSet dbSet; public EntityFrameworkRepository(IUnitOfWork unitOfWork) { var entityFrameworkUnitOfWork = unitOfWork as EntityFrameworkUnitOfWork; […]

使用LINQ-to-SQL,这个存储库模式是否有效?

我目前正在阅读Pro Asp.Net MVC Framework一书。 在本书中,作者建议使用类似于以下的存储库模式。 [Table(Name = “Products”)] public class Product { [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] public int ProductId { get; set; } [Column] public string Name { get; set; } [Column] public string Description { get; set; } [Column] public decimal Price { get; set; } [Column] public string […]

C#/ EF和存储库模式:将ObjectContext放在具有多个存储库的解决方案中的位置?

我的应用程序中有多个存储库。 我应该在哪里放置ObjectContext? 现在,我有一个像ObjectContext ctx;的引用ObjectContext ctx; 在每个存储库中。 什么是最聪明,最安全的方法?

如何正确使用Unity将ConnectionString传递给我的存储库类?

我刚刚开始使用微软的Unity应用程序块dependency injection库,而且我已经解开了。 这是我的IoC类,它将处理我的具体类到它们的接口类型的实例化(所以每次我想在我的控制器中存储库时,我不必在IoC容器上保持调用Resolve): public class IoC { public static void Intialise(UnityConfigurationSection section, string connectionString) { _connectionString = connectionString; _container = new UnityContainer(); section.Configure(_container); } private static IUnityContainer _container; private static string _connectionString; public static IMovementRepository MovementRepository { get { return _container.Resolve(); } } } 所以,我的想法是,从我的控制器,我可以做到以下几点: _repository = IoC.MovementRepository; 我目前收到错误: exception是:InvalidOperationException – 无法构造String类型。 您必须配置容器以提供此值。 现在,我假设这是因为我的映射具体实现需要为其构造函数提供单个字符串参数。 具体课程如下: […]