Tag: 工作单元

从另一个命令Handle()方法中调用命令

您好我正在使用Simple Injector DI库并且已经关注了一些关于围绕命令模式设计的架构模型的非常有趣的材料: 同时……在我的架构的命令端 同时……在我的架构的查询方面 容器将管理UnitOfWork的生命周期,我使用命令来执行数据库的特定function。 我的问题是,如果我有一个命令,例如AddNewCustomerCommand ,它反过来又对另一个服务执行另一个调用(即发送文本消息),从设计的角度来看这是可以接受的,还是应该在更高的层次上完成,如果是的话怎么做到最好? 示例代码如下: public class AddNewBusinessUnitHandler : ICommandHandler { private IUnitOfWork uow; private ICommandHandler otherHandler; AddNewBusinessUnitHandler(IUnitOfWork uow, ICommandHandler otherHandler) { this.uow = uow; this.otherHandler = otherHandler; } public void Handle(AddBusinessUnitCommand command) { var businessUnit = new BusinessUnit() { Name = command.BusinessUnitName, Address = command.BusinessUnitAddress }; var otherCommand = new […]

使用UnitOfWork和存储库模式与entity framework

我将在我的数据访问层中使用存储库和UnitOfwork来执行此操作,查看一个联系人aggregateroot public interface IAggregateRoot { } 这是我的Generic存储库接口: public interface IRepository { IEnumerable GetAll(); T FindBy(params Object[] keyValues); void Add(T entity); void Update(T entity); void Delete(T entity); } 和我在模型中的POCO Contact类 public class Contact :IAggregateRoot { public Guid Id { get; set; } public string Name { get; set; } public string Email { get; set; } […]

在大型项目中使用通用存储库/工作单元模式

我正在开发一个非常大的应用程序。 该域有大约20-30种类型,实现为ORM类(例如EF Code First或XPO,对于该问题无关紧要)。 我已经阅读了几篇关于存储库模式的通用实现的文章和建议,并将它与工作单元模式相结合,产生了类似这样的代码: public interface IRepository { IQueryable AsQueryable(); IEnumerable GetAll(Expression<Func> filter); T GetByID(int id); T Create(); void Save(T); void Delete(T); } public interface IMyUnitOfWork : IDisposable { void CommitChanges(); void DropChanges(); IRepository Products { get; } IRepository Customers { get; } } 这种模式适合大型应用吗? 每个示例在工作单元中有大约2个,最多3个存储库。 据我了解的模式,在一天结束时,存储库引用的数量(在实现中初始化的延迟)与域实体类的数量相等(或几乎相等),因此可以使用工作单元复杂的业务逻辑实现。 例如,让我们像这样扩展上面的代码: public interface IMyUnitOfWork : IDisposable { […]

asp.net mvc应用程序中的工作单元模式

我一直在关注这个名为“NHibernate和工作单元模式”的优秀博客 ,并且有一个关于在asp.net mvc项目中使用UnitOfWork.Start的最佳位置的问题。 我的SLN分为以下几个项目: – MVC project Repository NHibernateUnitOfWork 我有一个界面: – public interface INameRepository … IList GetByOrigin(int OriginId) … 我有一个具体的实现 public class NameRepository : INameRepository … public IList GetByOrigin(int OriginId) { using (UnitOfWork.Start()) { var query = session.Linq<… return query; } } … 我的问题是我使用(UnitOfWork.Start())将所有方法包装在我的所有存储库中,还是有更好的方法? 我正在使用nHibernate,asp.net mvc。

将多个DbContexts与通用存储库和工作单元一起使用

我的应用程序越来越大,到目前为止,我有一个MyDbContext ,它包含我在我的应用程序中需要的所有表。 我希望(为了概述)将它们分成多个DbContext ,如MainDbContext , EstateModuleDbContext , AnotherModuleDbContext和UserDbContext 。 我不确定这是怎么做的可能因为我现在正在使用dependecy injection(ninject)将我的DbContext放在我的UnitOfWork类上,如: kernel.Bind(typeof(IUnitOfWork)).To(typeof(UnitOfWork)); 我是否应该通过dependency injection和显式设置我希望在我的服务上使用的DbContext来删除此方法,例如: private readonly EstateService _estateService; public HomeController() { IUnitOfWork uow = new UnitOfWork(); _estateService = new EstateService(uow); } 代替: private readonly EstateService _estateService; public HomeController(IUnitOfWork uow) { _estateService = new EstateService(uow); } 或者这有另一种更好的方法吗? 另外作为一个附带问题,我不喜欢将uow传递给我的服务 – 还有另一种(更好的)方法吗? 码 我有这个IDbContext和MyDbContext: public interface IDbContext { […]

如何在一个MVC应用程序中完全结合EntityFramework,Repository,UnitOfWork和Automapper?

首先,我决定创建一个名为IDataAccessLayer接口,并开始将所有内容放入其中: GetUsers() , GetUser(int id) , GetOrderByNumber(int number) , DeleteOrder(int Id)等方法。 起初工作刚刚完美。 但后来我意识到DataLayer:IDataLayer的具体实现DataLayer:IDataLayer正在发展壮大。 我决定把它切成几个部分类文件。 我仍然觉得我做错了什么。 然后我决定为每个逻辑部分创建接口,如IUsers , IOrders , IItems等。没有用,因为我通过注入控制器构造函数的一个依赖属性访问存储库。 所以每次我需要在我的控制器中使用不同类型的dataContext时,我不能只添加另一个属性。 然后经过几个小时阅读有关entity framework的文章后,我终于意识到我必须使用Repository和Unit of work模式。 而且我仍然需要以某种方式将POCO与我的ViewModel对象分开,尽管他们几乎总是分享相似之处。 Automapper有很多帮助。 但是现在,我不确定如何一起使用所有东西。 entity framework,模式,自动映射和dependency injection框架,如Ninject。 我不清楚如何将所有内容混合到一个很棒的架构中。 你能告诉我一些很好的例子。

SQL Server:在事务中包装SELECT查询是否有任何性能损失?

作为学习练习,在尝试使用任何ORM(如EF)之前,我想使用ADO.NET和存储过程构建个人项目。 因为我不希望我的代码随着时间的推移变得混乱,我想使用一些模式,如存储库和UoW模式。 除了交易处理之外,几乎所有事情都已经解决了。 以某种方式’模拟’一个UoW,我使用了@jgauffin提供的这个类 ,但阻止我使用该类的是每次你创建该类的新实例( AdoNetUnitOfWork )时,你自动开始一个事务并且有一个很多情况下你只需要读取数据。 在这方面,这是我在我读过的一本SQL书中找到的: 在事务中执行SELECT语句可以在引用的表上创建锁定,这可以阻止其他用户或会话执行工作或读取数据 这是AdoNetUnitOfWork类: public class AdoNetUnitOfWork : IUnitOfWork { public AdoNetUnitOfWork(IDbConnection connection, bool ownsConnection) { _connection = connection; _ownsConnection=ownsConnection; _transaction = connection.BeginTransaction(); } public IDbCommand CreateCommand() { var command = _connection.CreateCommand(); command.Transaction = _transaction; return command; } public void SaveChanges() { if (_transaction == null) throw new InvalidOperationException(“Transaction […]

entity framework4 – 在哪里放置“ApplyCurrentValues”逻辑?

我正在使用“ 存根技术 ”来更新我的POCO(用于分离的上下文,ASP.NET MVC)。 这是我目前在我的控制器中的代码(可以工作): [HttpPost] public ActionResult Edit(Review review) { Review originalReview = _userContentService.FindById(review.PostId) as Review; var ctx = _unitOfWork as MySqlServerObjectContext; ctx.ApplyCurrentValues(“MyEntities.Posts”, review); _unitOfWork.Commit(); // ..snip – MVC stuff.. } 如您所见,到处都有代码味道。 🙂 几点: 我基本上都使用dependency injection(基于接口) 我使用工作单元模式来抽象ObjectContext并在多个存储库之间提供持久性 目前我的IUnitOfWork接口只有一个方法: void Commit(); 控制器有IUserContentService和IUnitOfWork注入DI IUserContentService在存储库中调用Find ,它使用ObjectContext 。 以上代码是我不喜欢的两件事: 我不想将IUnitOfWork转换为MySqlServerObjectContext 。 我不希望Controller必须关心ApplyCurrentValues 我基本上希望我的代码看起来像这样: [HttpPost] public ActionResult Edit(Review review) […]

使用Autofac注册通用类型

我有UnitofWork类,它实现了IUnitOfWork。 我试着用autofac注册: var builder = new ContainerBuilder(); builder .RegisterGeneric(typeof(UnitOfWork<Repository,>)) .As(typeof(IUnitOfWork)) .InstancePerDependency(); 实施是: public class UnitOfWork : IUnitOfWork where T : Repository where O : BaseEntity { } public interface IUnitOfWork : IDisposable { void SaveChanges(); } 给出“预期类型”错误 但是这个工作在另一个项目上: public class Repository : GenericRepository where T : BaseEntity { public Repository(IDbContext context) : base(context) { } […]

entity framework+存储库+工作单元

我正在考虑使用EF 4开始一个新项目并浏览一些文章,我发现了一些关于EF的文章和存储库模式以及工作单元 ( http://tdryan.blogspot.com/2011/03/another-entity-framework-4-repository_15.html和http://blogs.msdn.com/b/adonet/archive/2009/06/16/using -repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx ) 我正在使用第一个(第1部分,第2部分和第3部分)。 它们非常相似。 在这种情况下,我是新手。 我在这两个post之间感到困惑。 我已经创建了所有内容,但我不知道如何开始使用上下文并添加一些实体。 我发布了第二个链接,因为发布了实现它的方法。 ObjectContext派生自IUnitOfWork ,所以我很难选择哪两个更好用。