NHibernate和其他ORM中"工作单元"概念的含义是什么?
假设我在我的数据库中有多个数据库模式,例如:HumanRessources和Inventory.
在每个架构中包含多个表.您是否经常将数据库拆分为多个edmx,或者通常只将所有内容放在一个edmx中?
我正在考虑为每个模式创建一个edmx,但想知道这将如何影响unitorwork模式.通过阅读一些文章,ObjectContext将成为单元工作.通过定义2 edmx,我将得到2个ObjectContext:HumanRessourceContext和InventoryContext,这意味着每个将是一个单元工作.如果我希望对humanressource中的实体和inventorycontext中的实体进行的所有修改都是ATOMIC,那么这可以通过unitofwork模式实现吗?
我想编写一个简单的工作类单元,其行为如下:
using (var unitOfWork = new UnitOfWork())
{
// Call the data access module and don't worry about transactions.
// Let the Unit of Work open a session, begin a transaction and then commit it.
}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止(如果您认为我的设计错误,欢迎任何评论):
class UnitOfWork : IDisposable
{
ISession _session;
ITransation _transaction;
.
.
.
void Dispose()
{
_transaction.Commit();
_session.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是回滚事务,以防数据访问代码抛出一些异常.所以该Dispose()方法看起来像:
void Dispose()
{
if (Dispose was called because an exception was thrown)
{
_transaction.Commit();
}
else
{
_transaction.RollBack();
}
_session.Dispose();
} …Run Code Online (Sandbox Code Playgroud) c# nhibernate exception-handling data-access-layer unit-of-work
我上下搜索网络,我没有找到适合我的应用程序的设计.
我正在寻找Repository + UnitOfWork模式,它将管理连接并在完成后自动处理它们.
我需要支持Web应用程序,其中每个请求都有自己的UnitOfWork和Windows应用程序,其中每个线程都有自己的UnitOfWork.我需要模式自动处理请求/线程完成后的UnitOfWork.我也想在异常的情况下支持rolback.
现在我使用StructureMap所以我不想继续在建议答案中使用它.
我需要Repository模式的原因是为了实现我所有实体所需的所有能力.我需要UnitOfWork的原因是允许更多的实体更改.
我真的很乐意帮助你.
谢谢.
我正在使用微型orm(dapper),并且正在尝试为我的存储库提供一个工作单元(UoW)实现.我有点难过在我的UoW中如何最好地处理亲子(外键)关系.例如,如果我有以下两个直接映射到数据库表的实体:
public class User
{
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string Name { get; set; }
public int ClientDatabaseId { get; set; }
public ClientDatabase ClientDb { get; set; }
}
public class ClientDatabase
{
public int Id { get; set; }
public string DataSource { get; set; }
public string FailoverPartner { get; set; }
public string InitialCatalog { get; set; } …Run Code Online (Sandbox Code Playgroud) 我有一个MVC3项目,它使用Ninject,实体框架和工作单元模式与服务层.
我的AsyncService类有一个启动后台任务的函数,作为示例,它将用户添加到用户存储库.我目前的问题是,在我收到DbContext已被处理的错误之前,任务只能正确运行几秒钟.我注入Ninject的InRequestScope()的数据库上下文似乎正在处理,因为InRequestScope()将它与HttpContext联系起来.
我已经阅读了InThreadScope(),但是我不确定如何在我的MVC项目中正确实现它.
我的问题是:在我的任务中使用Ninject的正确方法是什么?
public class AsyncService
{
private CancellationTokenSource cancellationTokenSource;
private IUnitOfWork _uow;
public AsyncService(IUnitOfWork uow)
{
_uow = uow;
}
public void AsyncStartActivity(Activity activity)
{
...snip...
this.cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = this.cancellationTokenSource.Token;
var task = Task.Factory.StartNew(() =>
{
foreach (var user in activity.UserList)
{
this._uow.UserRepository.Add(new User() {UserID = user});
}
this._uow.Save();
}, cancellationToken);
...snip...
}
}
Run Code Online (Sandbox Code Playgroud) ninject unit-of-work task-parallel-library entity-framework-4 asp.net-mvc-3
您好我正在使用Simple Injector DI库并且已经关注了一些关于围绕命令模式设计的架构模型的非常有趣的材料:
容器将管理生命周期UnitOfWork,我使用命令来执行数据库的特定功能.
我的问题是,如果我有一个命令,例如一个AddNewCustomerCommand,它反过来执行另一个服务的另一个调用(即发送文本消息),从设计的角度来看这是可接受的还是应该在更高的层次上完成,如果是的话最好这样做?
示例代码如下:
public class AddNewBusinessUnitHandler
: ICommandHandler<AddBusinessUnitCommand>
{
private IUnitOfWork uow;
private ICommandHandler<OtherServiceCommand> otherHandler;
AddNewBusinessUnitHandler(IUnitOfWork uow,
ICommandHandler<OtherServiceCommand> 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 OtherServiceCommand()
{
welcomePostTo = command.BusinessUnitName
};
uow.BusinessUnitRepository.Add(businessUnit);
this.otherHandler.Handle(otherCommand);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET MVC 4应用程序,我想实现工作单元模式.
在我的Web项目中,我有:
IocConfig.cs
using System.Web.Http;
using NinjectMVC.Data;
using NinjectMVC.Data.Contracts;
using Ninject;
namespace NinjectMVC
{
public class IocConfig
{
public static void RegisterIoc(HttpConfiguration config)
{
var kernel = new StandardKernel(); // Ninject IoC
// These registrations are "per instance request".
// See http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/
kernel.Bind<RepositoryFactories>().To<RepositoryFactories>()
.InSingletonScope();
kernel.Bind<IRepositoryProvider>().To<RepositoryProvider>();
kernel.Bind<INinjectMVCUow>().To<NinjectMVCUow>();
// Tell WebApi how to use our Ninject IoC
config.DependencyResolver = new NinjectDependencyResolver(kernel);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Global.asax中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using …Run Code Online (Sandbox Code Playgroud) 我创建了一个基础设施,这是我们新的内部网络项目,并试图遵循几乎所有最佳实践.另外,我想提一下,这是我第一次从零创建架构.
目前,我的基础设施的第一个版本已经准备好并且运行良好 但我想在下一个版本实现有界上下文结构.
我试着解释下面的现状.
DbCore:负责数据操作.实体框架5代码首先使用.只有一个DbContext类,并且在其中定义了所有DbSet.另外,GenericRepository模式和Unit of Work模式基于以下接口实现.
IGenericRepository
public interface IGenericRepository<TEntity>
where TEntity : class {
void Delete(object id);
void Delete(TEntity entityToDelete);
System.Collections.Generic.IEnumerable<TEntity> Get(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null, Func<System.Linq.IQueryable<TEntity>, System.Linq.IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "");
System.Collections.Generic.IEnumerable<TEntity> GetAll();
TEntity GetByID(object id);
System.Collections.Generic.IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters);
void Insert(TEntity entity);
void Update(TEntity entityToUpdate);
}
Run Code Online (Sandbox Code Playgroud)
IUnitOfWork
public interface IUnitOfWork {
void Dispose();
IGenericRepository<Test> TestRepository {
get;
}
IGenericRepository<Log> LogRepository {
get;
}
void Save();
}
Run Code Online (Sandbox Code Playgroud)
模型: DbCore和实体框架域的负责存储实体模型 …
domain-driven-design unit-of-work repository-pattern bounded-contexts entity-framework-5
我正在使用依赖注入编写web api,在存储库的帮助下工作单元和Autofac作为容器.依赖性在24小时前被完美注入,但突然间,当我今天开始工作时,我一直收到错误
"消息":"发生错误.","ExceptionMessage":"尝试创建'SearchController'类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.","ExceptionType":" System.InvalidOperationException"
我将包括我的签名以及我如何注册类型,如果有人可以指出我的代码可能出错,我将非常高兴.
在我的网络api控制器上,我有
private IUnitOfWork<Listing> _unitOfWork = null;
public SearchController(IUnitOfWork<Listing> unitOfWork)
{
_unitOfWork = unitOfWork;
}
Run Code Online (Sandbox Code Playgroud)
工作单元采用泛型类型参数来创建存储库.
在我的WebApiConfig.cs中,我正在注册以下类型
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)).InstancePerDependency();
builder.RegisterType(typeof(SearchController)).UsingConstructor(typeof(IUnitOfWork<Listing>));
Run Code Online (Sandbox Code Playgroud)
我正在注册SearchController以使用接受IUnitOfWork <>的构造函数.在我添加Mocked单元测试之前一切正常,但出于某种目的,我现在继续得到这个错误.我还注册了DependencyResolver
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = resolver;
Run Code Online (Sandbox Code Playgroud) c# dependency-injection unit-of-work autofac asp.net-web-api2
unit-of-work ×10
c# ×7
.net ×3
nhibernate ×2
ninject ×2
architecture ×1
asp.net-mvc ×1
autofac ×1
dapper ×1
orm ×1