Tag: 存储库模式

存储库模式与entity framework4.1和父/子关系

我仍然对仓库模式有一些困惑。 我想要使​​用这种模式的主要原因是为了避免从域中调用EF 4.1特定的数据访问操作。 我宁愿从IRepository接口调用通用的CRUD操作。 这将使testing更容易,如果将来我必须更改数据访问框架,我将能够在不重构大量代码的情况下进行testing。 这是我的情况的一个例子: 我在数据库中有3个表: Group , Person和GroupPersonMap 。 GroupPersonMap是一个链接表,只包含Group和Person主键。 我使用VS 2010devise器创build了3个表格的EF模型。 EF足够聪明地假设GroupPersonMap是一个链接表,所以它不会在devise器中显示它。 我想使用现有的域对象而不是EF生成的类,所以我closures了模型的代码生成。 我现有的类与EF模型匹配如下: public class Group { public int GroupId { get; set; } public string Name { get; set; } public virtual ICollection<Person> People { get; set; } } public class Person { public int PersonId {get; set; } public […]

LINQ to SQL和存储库模式

我觉得我在圈子里跑来跑去。 我似乎无法确定正确的存储库模式使用LINQ to SQL 。 如果您熟悉Rob Conery的 MVC店面,您将看到他的实现将LINQ生成的模型与另一个类包装在一起,并将LINQ生成的模型简单地视为数据传输对象 (DTO)。 它看起来像这样: //Custom wrapper class. namespace Data { public class Customer { public int Id {get;set;} public string Name {get;set;} public IList<Address> Addresses {get;set;} } } //Linq-Generated Class – severly abbreviated namespace SqlRepository { public class Customer { public int Id {get;set;} public string Name {get;set;} public […]

服务层和存储库

我一直在使用MVC框架,我真的很喜欢这些问题被分离出来。 我已经陷入了让控制器做很多工作的坏习惯。 所以我真的在寻找一些build议。 当我第一次开始使用MVC时,我经常让控制器在数据库工作完成后对模型进行操作。 我知道这是不好的,所以搬到模型。 然而,我不满意,因为我希望我的模型是非常有学问的。 我已经做了一些阅读,我发现人们通过一个服务层来保持他们的控制器和模型的精益,我喜欢它的外观。 我只是想了解一个服务层和存储库应该如何一起工作。 这是我的假设,你能不能让我知道这是否是一种好的工作方式? 如果不需要对数据进行操作,则控制器可以直接调用存储库,因此不需要涉及服务层 一旦任何工作需要完成数据(业务逻辑),那么这应该在服务层完成,控制器将根据需要简单地调用服务层 一旦服务完成了业务逻辑,它就会根据需要使用存储库(如果数据需要保存)。 理想情况下,模型应该保持精益,理想情况下只是DTO的行为 数据validation将在模型中完成(使用MonoRailvalidation属性)。 我很欣赏,甚至不喜欢用很多属性来污染他们的模型,但这是一个不同的讨论。 我喜欢用户界面中自动jQueryvalidation的MonoRailvalidation属性的好处。 我试图把我所有的代码都转化为单一责任原则,因此试图理清我的编码习惯。 谢谢

服务层如何适合我的存储库实现?

我创build了一个POCO模型类和一个处理持久性的库类。 由于POCO无法访问存储库,因此存储库中有许多业务逻辑任务看起来不正确。 从我所读到的,看起来像我需要一个位于用户界面和存储库层之间的服务层。 我不确定的是它应该如何工作… 除了服务层之外,是否应该还有一个单独的业务逻辑层,或者说是服务层的angular色? 每个存储库是否应该有一个服务? 服务层是UI可以实例化模型对象的唯一方式还是存储库将新模型实例提供给服务? 我是否将参数,模型和其他validation放在服务层中进行检查,以确保input有效,并且在更新之前数据库中存在要更新的项目? 模型,存储库和用户界面是否都可以调用服务层,还是仅供用户界面使用? 服务层应该是所有静态方法吗? 什么是从UI调用服务层的典型方法? 应该在模型和服务层上进行什么validation? 以下是我现有图层的一些示例代码: public class GiftCertificateModel { public int GiftCerticiateId {get;set;} public string Code {get;set;} public decimal Amount {get;set;} public DateTime ExpirationDate {get;set;} public bool IsValidCode(){} } public class GiftCertificateRepository { //only way to access database public GiftCertificateModel GetById(int GiftCertificateId) { } public List<GiftCertificateModel> GetMany() […]

存储库模式与“智能”业务对象

当涉及到在.NET上创build更大规模的企业范围应用程序(Winforms,WPF,ASP.NET)时,我看到两个主要的“思想stream派”。 一些人使用“存储库模式”,它使用知道如何获取,插入,更新和删除对象的存储库。 这些对象是相当“愚蠢的”,因为它们不一定包含大量的逻辑 – 例如它们或多或less是数据传输对象。 另一个阵营使用我称之为“聪明”的业务对象,知道如何加载自己,他们通常有一个Save(),可能是Update()甚至Delete()方法。 在这里,你真的不需要任何库 – 对象本身知道如何加载和保存自己。 最大的问题是 :你使用或喜欢哪一个? 为什么? 你在所有的应用程序中使用相同的方法,或者你有什么特别的标准来select一种方法吗? 如果是这样 – 这些标准是什么? 我并不是试图在这里开始一场火焰战争 – 试图找出每个人对此的看法,你的看法是什么,以及为什么你使用一种(或两种)模式。 感谢您的任何build设性意见!

ASP.NET MVC的最佳存储库模式

我最近学习ASP.NET MVC(我喜欢它)。 我正在与一家公司使用dependency injection来加载每个请求中的存储库实例,我熟悉使用该存储库。 但是现在我正在写一些我自己的MVC应用程序。 我并不完全了解我公司使用的存储库的方式和原因,我正在试图确定实现数据访问的最佳方法。 我正在使用C#和entity framework(与所有最新版本)。 我看到了三种处理数据访问的一般方法。 每次访问数据时,使用语句中的常规数据库上下文。 这很简单,它工作正常。 但是,如果两个位置需要在一个请求中读取相同的数据,则必须读取两次数据。 (每个请求使用一个存储库,两个地方都使用相同的实例,我知道第二次读取只是从第一次读取返回数据。) 典型的存储库模式 。 由于我不明白的原因,这个典型的模式涉及到为数据库中使用的每个表创build一个包装类。 这对我来说似乎是错误的。 实际上,由于它们也是作为接口来实现的,所以在技术上我会为每个表创build两个包装类。 EF为我创build表格。 我不相信这种方法是有道理的。 还有一个通用的存储库模式 ,其中创build单个存储库类来为所有实体对象提供服务。 这对我来说更有意义。 但是对别人有意义吗? 链接是否是最好的方法? 我很想得到这个话题的其他人的意见。 你正在编写自己的存储库,使用上述之一,或完全不同的东西。 请分享。

方法不能转换成商店expression式

我看到这个代码与LINQ to SQL的工作,但是当我使用entity framework,它会引发这个错误: LINQ to Entities不能识别方法'System.Linq.IQueryable'1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures()'方法,并且此方法不能被转换成存储expression式。 存储库代码是这样的: public IQueryable<Models.Estate> GetEstates() { return from e in entity.Estates let AllCommFeat = GetCommunityFeatures() let AllHomeFeat = GetHomeFeatures() select new Models.Estate { EstateId = e.EstateId, AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat), AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat) }; } public IQueryable<Models.CommunityFeatures> GetCommunityFeatures() { return from f in entity.CommunityFeatures select new […]

在PHP中正确的存储库模式devise?

前言:我试图在MVC体系结构中使用关系数据库中的存储库模式。 我最近开始在PHP中学习TDD,我意识到我的数据库与我的应用程序的其他部分密切相关。 我已经阅读了关于存储库,并使用IoC容器 “注入”到我的控制器。 非常酷的东西。 但是现在有关于存储库devise的一些实际问题。 考虑下面的例子。 <?php class DbUserRepository implements UserRepositoryInterface { protected $db; public function __construct($db) { $this->db = $db; } public function findAll() { } public function findById($id) { } public function findByName($name) { } public function create($user) { } public function remove($user) { } public function update($user) { } } 问题#1:太多领域 […]

寻找一个像InRequestScope一样的Ninject范围

在我的服务层上,我在构造函数中注入了一个UnitOfWork和2个存储库。 工作单元和存储库有一个DbContext实例,我想在它们之间共享。 我怎样才能和Ninject做到这一点? 应考虑哪个范围? 我不在一个Web应用程序,所以我不能使用InRequestScope 。 我尝试做类似的事情……而我正在使用DI,但是,我需要我的UoW来Dispose d并创build它。 using (IUnitOfWork uow = new UnitOfWorkFactory.Create()) { _testARepository.Insert(a); _testBRepository.Insert(b); uow.SaveChanges(); } 编辑:我只是想确定我明白…后看看https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope我虽然关于我当前的控制台应用程序架构,实际上使用Ninject。 让我们说: A类是一个服务层类 B类是一个工作单元,它将一个接口(IContextFactory) C类是一个存储库,它将一个接口(IContextFactory) 这里的想法是能够在2个或更多的资源库上进行上下文操作,并使用工作单元来应用这些变化。 D类是一个上下文工厂(Entity Framework),它提供了一个在B类和C类之间共享的上下文的实例(保存在容器中),也可以用于其他的存储库。 上下文工厂保存在他的容器中的实例,所以我不想重复使用这个实例所有的名字,因为上下文需要被放置在服务operaiton的末尾..这实际上是InNamedScope的主要目的? 解决的办法是,但我不确定我是否做得对,服务实例会变成这样,这意味着他们实际上从来没有处置? : Bind<IScsContextFactory>() .To<ScsContextFactory>() .InNamedScope("ServiceScope") .WithConstructorArgument( "connectionString", ConfigurationUtility.GetConnectionString()); Bind<IUnitOfWork>().To<ScsUnitOfWork>(); Bind<IAccountRepository>().To<AccountRepository>(); Bind<IBlockedIpRepository>().To<BlockedIpRepository>(); Bind<IAccountService>().To<AccountService>().DefinesNamedScope("ServiceScope"); Bind<IBlockedIpService>().To<BlockedIpService>().DefinesNamedScope("ServiceScope");

为什么在这个例子中使用PerThreadLifetimeManager?

我正在关注下面的例子来设置统一与我的服务层一起工作。 我的项目设置与本文中的非常相似,除了为什么在注册服务依赖项时使用PerThreadLifetimeManager,我明白了一切。 请记住,我也在使用我的服务层中使用的通用存储库和unitofwork。 大多数统一的例子使用默认(瞬态)生存期pipe理器,因为我的设置类似于下面的我想知道为什么我应该使用PerThreadLifeimeManager? 如果改变了任何东西,我正在为当前表示层使用ASP.NET Web窗体项目。 container.RegisterType<ICatalogService, CatalogService>(new PerThreadLifetimeManager()) 在asp.net MVC 3中使用EF代码第一个dependency injection的存储库模式