谁有责任
谁有责任在MVC架构中启动和完成工作单元?
我正在创建我的第一个N-Tier MVC应用程序,并且我遇到了如何DbContexts使用我的数据库第一种方法来管理多个的路障.
我有以下几层
Presentation
Service (WCF)
Business
Data Access
Run Code Online (Sandbox Code Playgroud)
我不想在我的服务层中使用实体框架引用,但是我没有看到如何创建接口或管理两个上下文的东西.我让它在IDatabaseFactory中使用单个上下文,但我似乎无法找到管理两个的方法.
下面是我UnitOfWork在我的服务ctor中创建的,但我看待它的每一种方式我仍然依赖于它SiteModelContainer,而实际上我有另一个上下文.
public class UnitOfWork : IUnitOfWork
{
private SiteModelContainer _context;
private readonly IDatabaseFactory _databaseFactory;
protected SiteModelContainer SiteContext
{
get { return _context ?? (_context = _databaseFactory.Get()); }
}
public UnitOfWork(IDatabaseFactory factory)
{
_databaseFactory = factory;
_context = _databaseFactory.Get();
}
//More code
}
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private SiteModelContainer _dataContext;
public SiteModelContainer Get()
{
return _dataContext ?? (_dataContext = new SiteModelContainer());
} …Run Code Online (Sandbox Code Playgroud) 我正在使用" 存根技术 "来更新我的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..
}
Run Code Online (Sandbox Code Playgroud)
如你所见,到处都有代码味道.:)
几点:
void Commit();IUserContentService并IUnitOfWork通过DI注入IUserContentServiceFind在存储库中调用,使用ObjectContext.这些是我不喜欢上面代码的两件事:
MySqlServerObjectContext.ApplyCurrentValues我基本上希望我的代码看起来像这样:
[HttpPost]
public ActionResult Edit(Review review)
{
_userContentService.Update(review);
_unitOfWork.Commit();
// ..snip - MVC stuff..
}
Run Code Online (Sandbox Code Playgroud)
任何想法我怎么能这样做?(或类似的东西).
我已经很聪明地根据类型(泛型,复数的组合)来计算实体集名称,所以不要过于担心.
但我不知道放在哪里最好的地方 …
我最近了解了存储库和工作单元设计模式,并认为我将在新的EF4 MVC3项目中实现它们,因为抽象通常很好.
当我将它们添加到项目中时,我想知道果汁是否值得谚语挤压,给出以下内容:
我看到使用Repository模式的唯一真正好处是单元测试应用程序.抽象出数据存储似乎并不有用,因为我知道数据存储区不会改变,而且,EF4已经提供了一个非常好的抽象(我只是调用.AddObject(),它看起来像我在修改内存中集合,我只是调用.SaveChanges()已经提供了工作单元模式).
我是否应该费心实施这种抽象?我觉得必须有一些我遗漏的巨大好处,但我觉得我不需要沿着这条路走下去.我愿意相信; 有人可以提起诉讼吗?谢谢.
entity-framework unit-of-work repository-pattern asp.net-mvc-3
我试图在单个视图中更新复杂模型.我正在使用ASP.NET MVC3,Entity Framework with Code first,工作单元,通用存储库模式..但是当我尝试更新模型时,我想出了这个错误:
发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致.
这是我的简化视图模型:
public class TransactionViewModel
{
public Transaction Transaction { get; set; }
public bool IsUserSubmitting { get; set; }
public IEnumerable<SelectListItem> ContractTypes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的简化复杂模型,并作为其导航属性之一的示例.Transaction与其所有导航属性具有一对一的关系:
public class Transaction
{
[Key]
public int Id { get; set; }
public int CurrentStageId { get; set; }
public int? BidId { get; set; }
public int? EvaluationId { get; set; }
public virtual Stage CurrentStage { get; set; }
public virtual Bid Bid …Run Code Online (Sandbox Code Playgroud) 如何使用Autofac在WCF服务中实现工作单元模式?
使用Autofac的wcf集成,可以轻松地将每个调用(或Autofac术语LifetimeScope)工作接口单元中的相同实例注入到我的服务和存储库中 - 我所遵循的是在返回WCF服务时提交工作单元更改的方法如果没有任何例外,显然只会打电话.
我已经看到使用自定义端点行为与WCF和Autofac,这基本上是我开始,但不处理异常.
目前我所拥有的是IOperationInvoker在Invoke中启动工作单元并仅在没有任何异常的情况下提交它.这种方法的问题是我需要在方法中解析我的工作单元实例,Invoke这给了我一个不同于注入我的服务和存储库的实例AutofacInstanceProvider.
我正在尝试在我的MVC Web应用程序中实现工作单元/存储库模式.
由于DbContext本身是一个工作单元,我想将它与我自己的UOW混合用于测试和解耦目的(将业务层与EF分离).那么将我的DbContext内部包装成如下所示的UOW类是一个好主意吗?
为清晰起见,代码减少
public interface IUnitOfWork
{
void Save();
}
public MyContext : DbContext
{
// DbSets here
}
public UnitOfWork : IUnitOfWork
{
public MyContext myContext { get; set; }
void Save()
{
myContext.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我会调用UnitOfWork实例来执行数据操作.
非常感谢提前:-)
asp.net-mvc repository-design unit-of-work repository-pattern dbcontext
我正在尝试用NHibernate实现UnitOfWork和Repository模式.我正在寻找在工作单元实例和存储库实例之间共享会话的最佳方法.
最明显的方法是ThreadStatic在UnitOfWork课堂上介绍属性
public class UnitOfWork : IUnitOfWork
{
public static UnitOfWork Current
{
get { return _current; }
set { _current = value; }
}
[ThreadStatic]
private static UnitOfWork _current;
public ISession Session { get; private set; }
//other code
}
Run Code Online (Sandbox Code Playgroud)
然后在Repository课堂上:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
protected ISession Session { get { return UnitOfWork.Current.Session; } }
//other code
}
Run Code Online (Sandbox Code Playgroud)
但是我不喜欢上面列出的实现,并决定找到另一种方法来做同样的事情.
所以我带来了第二种方式:
public interface ICurrentSessionProvider : …Run Code Online (Sandbox Code Playgroud) 我有一个脚本将循环中的一些“A”类型的新实体保存到数据库中。但是循环会抛出一些关闭 entityManager 的异常。所以必须重开。它导致应该与每个“A”实体连接的另一个“B”类型的实体与 unitOfWork 分离。如何将“B”附加到 unitOfWork?这是一个例子:
public function insert( Array $items )
{
$B = $this->bRepository->findOneBy( ['name' => 'blog'] );
$result = [ 'errors' => [], 'saved_items' => [] ];
foreach( $items as $item )
{
try
{
$A = new Entity\A();
$A->create([
'name' => $item->name,
'B' => $B // Here is the problem after exception. $B is detached.
]);
$this->em->persist( $A );
$this->em->flush( $A );
$result['saved_items'][] = $item->name;
} catch( \Eception $e )
{
$result['errors'][] = 'Item ' . …Run Code Online (Sandbox Code Playgroud) 例如我有这个类:
public class UnitOfWork : IUnitOfWork
{
private readonly ApplicationDbContext _context;
public IProductRepository Products { get; private set; }
public ICategoryRepository Categories { get; private set; }
public IPhotoRepository Photos { get; private set; }
public UnitOfWork(ApplicationDbContext context, IProductRepository productRepository,
ICategoryRepository categoryRepository, IPhotoRepository photoRepository)
{
_context = context;
Products = productRepository;
Categories = categoryRepository;
Photos = photoRepository;
}
public int Complete()
{
return _context.SaveChanges();
}
public Task<int> CompleteAsync()
{
return _context.SaveChangesAsync();
}
public void Dispose()
{
_context.Dispose();
}
public async …Run Code Online (Sandbox Code Playgroud) c# dependency-injection idisposable unit-of-work asp.net-core
unit-of-work ×10
c# ×4
asp.net-mvc ×3
autofac ×2
dbcontext ×2
repository ×2
architecture ×1
asp.net-core ×1
detach ×1
doctrine-orm ×1
entity ×1
idisposable ×1
nhibernate ×1
wcf ×1