我已经在企业应用程序架构的模式中读到,工作单元应该只在单个会话中使用.所以每个会议应该有唯一的工作单位.任何人都可以告诉我为什么我不能在整个应用程序中使用一个工作单元(在我的案例中是ASP.NET).
在过去一周左右的时间里,我一直在阅读很多关于存储库模式的文章和教程.许多文章将存储库模式与工作模式单元紧密联系在一起.在这些文章中,我通常会找到与此类似的代码:
interface IUnitOfWork<TEntity>
{
void RegisterNew(TEntity entity);
void RegisterDirty(TEntity entity);
void RegisterDeleted(TEntity entity);
void Commit();
void Rollback();
}
interface IRepository<TKey, TEntity>
{
TEntity FindById(TKey id);
IEnumerable<TEntity> FindAll();
void Add(TEntity entity);
void Update(TEntity entity);
void Delete(TEntity entity);
}
class Repository : IRepository<int, string>
{
public Repository(IUnitOfWork<string> context)
{
this.context = context;
}
private IUnitOfWork<string> context;
public void Add(string entity)
{
context.RegisterNew(entity);
}
public void Update(string entity)
{
context.RegisterDirty(entity);
}
public void Delete(string entity)
{
context.RegisterDeleted(entity);
}
/* Entity retrieval methods */ …Run Code Online (Sandbox Code Playgroud) 我有一个基于以下架构的MVC Web应用程序
Asp.Net MVC2,Ninject,Fluent NHibernate,MySQL使用单位工作模式.
与MySQL的每个连接都会生成一个睡眠连接,可以将其视为SHOW PROCESSLIST查询结果中的一个条目.
最终,这将产生足够的连接来执行应用程序池限制并使Web应用程序崩溃.
我怀疑连接没有正确处理.
如果是这种情况,应该如何发生?
这是我正在使用的代码的快照:
public class UnitOfWork : IUnitOfWork
{
private readonly ISessionFactory _sessionFactory;
private readonly ITransaction _transaction;
public ISession Session { get; private set; }
public UnitOfWork(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
Session = _sessionFactory.OpenSession();
Session.FlushMode = FlushMode.Auto;
_transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
}
public void Dispose()
{
if (Session != null)
{
if (Session.IsOpen)
{
Session.Close();
Session = null;
}
}
}
public void Commit()
{
if (!_transaction.IsActive)
{
throw new InvalidOperationException("No active …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个遵循存储库和工作单元模式的系统,以允许持久性无知/单元测试等.我正在寻找有关处理Rollback的建议.理想情况下我想使用POCO,但我想我可能至少需要实现一个接口来提供一些零碎的东西.
因此,假设我们有两个存储库,一个上下文/工作单元.
我添加一个项目,修改另一个项目并删除第三个项目.重复第二个存储库,然后我调用rollback.
在过去,我使用了类似于DataSet的东西.每个对象都有pendingNew,pendingAmended,pendingDeleted,clean状态.还有用于回滚的对象的最后一个持久版本的副本.
你会如何实现这个?
编辑:
好的,这就是我认为我实际上想要了解的问题.准备好图案:)
最终该项目是WPF MVVM.所以我们正在看模型到这里的商店.
我想我一直在尝试将模型与存储库的想法混为一谈,我认为模型应该使用UOW和存储库来提供模型需要提供的功能.这听起来更好吗?
我想要完全持久性无知,所以想象一下我的域名包括客户,订单和订单线.
GUI假设有一个按钮新订单,允许用户填写客户详细信息,订单详细信息和1-n OrderLine详细信息.他点击保存并进入数据库,他点击取消他们没有.
因此,在这种情况下,模型可能会向CustomerRepository询问客户,然后向OrderRepository询问新订单,然后询问每个新行的OrderLineRepository,然后告诉工作单元保存它们.
这听起来合理吗?这对我来说,我认为这是分离的定义.我很想在模型和存储库之间使用另一个API.不,那太傻了.
编辑2:这是一篇很好的文章,有点帮助.
我对使用多个对象上下文的工作单元和存储库实现有疑问.我的应用使用3个数据库中的数据.这意味着我有三个对象上下文,每个上下文代表一个数据库.我需要从一个数据库获取数据,但必须通过从其他2个数据库中读取过滤条件来过滤数据.我将这三个对象上下文传递给unitofwork构造函数,以便我可以访问我的存储库中的另外两个对象上下文.我在互联网上搜索了很多,但找不到任何好的答案.如果我做得对,或者是否有处理这种情况的标准方法,请你建议吗?
谢谢,Ajay.
我正在使用.net 4与C#,EntityFramework 4和Moq 4.我正在尝试模拟我的UnitOfWork,一个Repository,最后是一个方法调用.
这是我遇到问题的代码
var unitOfWorkMock = new Mock<UnitOfWork>();
var cFieldRepositoryMock = new Mock<IRepository<CField>>();
System.Linq.Expressions.Expression<Func<CField, bool>> query = (x) => x.CID == c && x.FID == parentFID;
cFieldRepositoryMock.Setup(x => x.GetFirst(query));
Run Code Online (Sandbox Code Playgroud)
GetFirst的方法签名:
T GetFirst(Expression<Func<T, bool>> query = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null);
Run Code Online (Sandbox Code Playgroud)
CField:
public class CField
{
public CField()
{
//do stuff
}
public int ID { get; set; }
public int FID { get; set; }
public int CID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我期望发生的事情:我期待我调用我的cFieldRepositoryMock的GetFirst方法,它将匹配我传入的lambda表达式与我在Setup中定义的表达式.
发生了什么:我在安装程序分配上遇到编译器错误:"表达式树可能不包含使用可选参数的调用或调用"
我显然做错了什么,我只是不确定是什么.任何建议表示赞赏,我对单元测试相当新.
谢谢!AFrieze
我正在使用以下内容构建Web应用程序:MVC5和EF Code First with Repository和Unit of Work Patterns.直到现在我有3层:
我的域/业务对象在另一个项目中分开.所以基本上我遵循John Papa CodeCamper结构,除了添加"服务层".
数据/合同/ IRepository.cs
public interface IRepository<T> where T : class
{
IQueryable<T> GetAll();
T GetById(int id);
void Add(T entity);
void Update(T entity);
void Delete(T entity);
void Delete(int id);
}
Run Code Online (Sandbox Code Playgroud)
数据/合同/ IUnitOfWork.cs
public interface IUnitOfWork
{
// Save pending changes to the data store.
void Commit();
// Repositories
IRepository<Event> Events { get; }
IRepository<Candidate> Candidates { get; }
} …Run Code Online (Sandbox Code Playgroud) c# design-patterns unit-of-work entity-framework-6 asp.net-mvc-5
情况
我正在使用标题提到的技术构建一个Web应用程序.此应用程序类似于多个客户端的CMS系统.客户端必须使用其公司名称和登录凭据登录此系统.使用提供的公司名称,我连接到数据库(静态DbContext,每次都使用相同的连接字符串),其中存储所有客户端数据库信息并搜索此客户端特定数据库(每个客户端都有自己的完全相同的设计)登录信息.一切正常.现在这里是棘手的部分.要继续登录过程,我需要以某种方式使用其他DbContext注入或延迟加载存储库,其中连接字符串是从其他数据库的结果构建的.
是)我有的
2 DB内容从现有数据库生成,一个是静态的,一个是动态的.
那课.通用存储库类/接口
public interface IRepository
{
void Submit();
}
public interface IRepository<TEntity, TContext> : IRepository
where TEntity : class
where TContext : DbContext
{
//crud stuff
}
public abstract class GenericRepository<TEntity, TContext> : IRepository<TEntity, TContext>
where TEntity : class
where TContext : DbContext
{
private TContext _dataContext;
private IUnitOfWork _unitOfWork;
private readonly IDbSet<TEntity> dbset;
protected GenericRepository(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
_unitOfWork.Register(this);
}
}
Run Code Online (Sandbox Code Playgroud)
工作单元/接口单元
public interface IUnitOfWork
{
void Register(IRepository repository);
void Commit();
}
public …Run Code Online (Sandbox Code Playgroud) entity-framework dependency-injection unit-of-work autofac repository-pattern
我有一个Dropwizard服务,该服务使用dropwizard-hibernate进行数据库调用。当前,我们正在使用@UnitOfWork资源方法来实现事务性。
但是,我们最近有一个用例,将资源方法中的部分代码提交到事务中。
我尝试使用UnitOfWorkAwareProxyFactoryUnitOfWork的方法级别注释并将其放入资源方法的方法中。但是,这样做的问题是那些未包装的数据库调用@UnitOfWork无法访问任何会话,因此会失败。
作为一种解决方法,我尝试将@UnitOfWork注释以嵌套方式放置(在资源方法和内部方法上)。但是,我的内部方法退出作用域后没有将事务写入数据库。相反,当资源方法返回时,将执行一个最终事务。
我还尝试将顶级@UnitOfWork注释的'transactional'属性设置为false ,但没有任何好处。
我不想手动处理Dao类中的会话,因为这些类的其他调用者@UnitOfWork在资源级别使用注释。
知道如何实现吗?
在《清洁建筑》(Robert C. Martin)一书中。191,他指出“实体是纯粹的业务逻辑,别无其他”。我不确定我应该如何从持久性机制的实体知识方面解释这一说法。
我假设实体对象是有状态的-它们操纵了它们代表的业务数据。如果是这样,则必须通知持久层该数据的更改,以便它可以保留这些更改。因此; 实体是否可以保留对持久性接口(或工作单元接口,如果设计更为精细的话)的引用?
我倾向于认为,拥有这样一个引用(并从实体内部调用)的实体对象将不是“纯业务规则”。但我有一种感觉,只要实体持有对接口的引用,它就不算数吗?
而且,如果实体不应保留对持久性机制的引用,那么是否存在其他用于持久化业务数据更改的良好模式?
architecture design-patterns unit-of-work clean-architecture
unit-of-work ×10
c# ×4
repository ×2
architecture ×1
asp.net-mvc ×1
autofac ×1
dropwizard ×1
hibernate ×1
java ×1
moq ×1
mysql ×1
ninject ×1
orm ×1
poeaa ×1
unit-testing ×1