我目前正在研究如何将单元工作模式添加到使用NHibernate的现有ASP.NET MVC应用程序中.我在各种实现中看到了很多变化,我无法确定在给定情况下哪种方法最有效.
为了提供帮助,我想我会要求Stack Overflow社区列出他们在ASP.NET MVC应用程序中实现工作单元模式的最佳方式.
也许您在创建控制器时使用IoC来实例化NHibernate会话,然后将其传递给存储库.或者您可能创建一个工作类/接口单元.在描述您的方法后,请不要犹豫链接到其他资源.
此外,请务必列出与您的方法相关的任何利弊.
干杯!我对使用工作单元和存储库有些怀疑.特别是来自Entity Framework的子上下文的角色.我已经搜索了很多关于这个主题的信息,但是我发现只是不同类型的使用模式,我很困惑,我无法理解主要思考.
1.我应该在哪里实现处置和储蓄? - 它是否在DbContext的继承类中正确实现了Disposable?之后在存储库和工作单元中实现或仅在Uni fo工作中实现?
- 把方法保存在工作单元或存储库中?
我的存储库将是Generic我的代码在架构师风格和其他细节方面是否正确?请告诉我的想法是否错误.
interface IRepository : IDisposable
{
void Create();
void Delete();
void Update();
void Get();
T getSomeByExpression()
...Some another costum operations
...should I remember about Save here?
}
class Repository : IRepository
{
SomeContext context = new SomeContext();
...Using using(context = new SomeContext()){} in functions??
...
....Disposing?
}
interface IUnitOfWork : IDisposable
{
...Which methods I should realize?
Commit()
Save()
...Need some another methods like rollback, Attach() Add() or Dispose or something else? …Run Code Online (Sandbox Code Playgroud) 我有一个问题,EF没有返回3层WPF应用程序中的最新数据,我怀疑它与我如何处理我的上下文的生命周期有关.这是场景:
UnitOfWork中包含几个存储库.还有一个服务(MyService),它使用UnitOfWork.还必须直接从UI调用此UnitOfWork,而不通过服务.
在我的主窗口的ViewModel中,我创建了一个新窗口(首先使用ViewModel):
var dialog = new DialogViewModel(_eventAggregator, _unitOfWork, Container.Resolve<CarService>());
Run Code Online (Sandbox Code Playgroud)
这个主窗口ViewModel有一个UnitOfWork,它已经在构造函数中注入,并传递给DialogViewModel.
CarService的构造函数也需要一个UnitOfWork,它也在它的构造函数中注入:
public CarService(IUnitOfWork unitOfWork){
_unitOfWork = unitOfWork;
}
Run Code Online (Sandbox Code Playgroud)
当在DialogViewModel中使用CarService进行查询以检索某些数据并进行一些更新时,它第一次正常工作.但是,当下次检索该数据时进行相同的查询,而不是返回最新的修改后的数据,它将返回旧的/缓存的数据.使用UnitOfWork(在CarService内部)的查询如下所示:
var values = _unitOfWork.GarageRepository.GetSomeValues();
_unitOfWork.GarageRepository.MakeSomeChangesToTheValuesUsingStoredProcedure();
Run Code Online (Sandbox Code Playgroud)
第二次调用它时,值不包含最新版本的数据; 但它已在DB中成功更新.
我正在使用Unity进行DI,这就是我的容器的样子:
public class Container
{
public static UnityContainer Container = new UnityContainer();
// Called once in the AppBoostraper, as soon as the GUI application starts
public void BuildUp()
{
Container.RegisterType<IUnitOfWork, UnitOfWork>();
Container.RegisterType<ICarService, CarService>();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不返回正确的数据,我该如何解决?
c# entity-framework dependency-injection unity-container unit-of-work
我有以下代码在事务中.我不确定我应该在何时/何时提交我的工作单位.
故意,我没有提到我正在使用什么类型的Respoistory - 例如.Linq-To-Sql,实体框架4,NHibernate等
如果有人知道在哪里,他们可以解释为什么他们说,在哪里?(我试图通过示例来理解模式,而不是让我的代码工作).
这是我得到的: -
using
(
TransactionScope transactionScope =
new TransactionScope
(
TransactionScopeOption.RequiresNew,
new TransactionOptions
{ IsolationLevel = IsolationLevel.ReadUncommitted }
)
)
{
_logEntryRepository.InsertOrUpdate(logEntry);
//_unitOfWork.Commit(); // Here, commit #1 ?
// Now, if this log entry was a NewConnection or an LostConnection,
// then we need to make sure we update the ConnectedClients.
if (logEntry.EventType == EventType.NewConnection)
{
_connectedClientRepository.Insert(
new ConnectedClient { LogEntryId = logEntry.LogEntryId });
//_unitOfWork.Commit(); // Here, commit #2 ?
}
// A (PB) BanKick …Run Code Online (Sandbox Code Playgroud) 有可能(甚至可能)我只是没有完全理解"工作单元"的概念.基本上,我将其视为面向对象环境中使用的广泛事务.启动工作单元,与对象交互,提交或回滚.但是,这如何分解为这些对象背后的数据存储的实际事务?
在具有单个DB和ORM(例如NHibernate)的系统中,它很容易.可以通过ORM维护交易.但是,自定义域模型隐藏了许多不同数据源的系统呢?并非所有这些数据源都是关系数据库?(这里的文件系统已经做了很多.)
现在,我坚持认为"你根本无法在同一'原子'业务操作中跨SQL2005数据库,SQL2000数据库,DB2数据库和文件系统维护事务." 因此,目前,团队中的开发人员(通常彼此独立工作)负责在代码中手动维护事务.每个DB都可以在其上进行适当的事务处理,但是整个业务操作都是手动检查并在每个重要步骤中进行平衡.
但是,随着域和标准开发人员流动的复杂性增加,这种方法将变得越来越困难并且随着时间的推移而容易出错.
有没有人有任何关于如何最好地解决这样一个领域的建议或例子,或者之前如何处理它?在这种情况下,实际的"域"仍处于起步阶段,随着原型的发展,有朝一日扩展并消耗/替换大型不同遗留应用程序的生态系统.因此,有足够的空间进行重新设计和重新分解.
作为参考,我目前的目标是10,000英尺的设计视图:大量的小型as-dumb-as-possible客户端应用程序调用基于消息的中央服务.该服务是"域核心"的入口,可以被认为是一个大型MVC风格的应用程序.对服务进行请求(很像"动作"),由处理程序拾取(很像"控制器").任何程序都在那里.它们与包含所有业务规则的模型进行交互.模型发布的事件是监听器("服务"?这部分在设计中仍然是多云并且需要改进)通过与存储库(数据库x,数据库y,文件系统,电子邮件,任何外部资源)交互来获取和处理.所有的快乐依赖注入相应.
抱歉所有的冗长:)但如果有人有任何建议,我很乐意听到它.即使(特别是)如果这个建议是"你的设计很糟糕,试试这个......"谢谢!
我找到了一些如何使用ef4创建工作单元的示例,我没有使用di/ioc,我想保持简单,这是一个例子(90%的灵感),我认为它没关系但是因为我正在看从现在开始使用的模式我想最后一次提出意见.
public interface IUnitOfWork
{
void Save();
}
public partial class TemplateEntities : ObjectContext, IUnitOfWork
{
....
public void Save()
{
SaveChanges();
}
}
public interface IUserRepository
{
User GetUser(string username);
string GetUserNameByEmail(string email);
void AddUser(User userToAdd);
void UpdateUser(User userToUpdate);
void DeleteUser(User userToDelete);
//some other
}
public class UserRepository : IUserRepository, IDisposable
{
public TemplateEntities ctx;
public UserRepository(IUnitOfWork unit)
{
ctx = unit as TemplateEntities;
}
public User GetUser(string username)
{
return (from u in ctx.Users
where u.UserName == username …Run Code Online (Sandbox Code Playgroud) 我要求异步执行任务,同时丢弃任何进一步的请求,直到任务完成.
同步方法只是将任务排队,不会跳过.我最初想过使用SingleThreadExecutor,但也排队等待任务.然后我查看了ThreadPoolExecutor,但是它读取队列以获取要执行的任务,因此将执行一个任务并且至少有一个任务排队(其他任务可以使用ThreadPoolExecutor.DiscardPolicy丢弃).
我唯一能想到的就是使用信号量来阻止队列.我带着以下示例来展示我想要实现的目标.有更简单的方法吗?我错过了一些明显的事吗?
import java.util.concurrent.*;
public class ThreadPoolTester {
private static ExecutorService executor = Executors.newSingleThreadExecutor();
private static Semaphore processEntry = new Semaphore(1);
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 20; i++) {
kickOffEntry(i);
Thread.sleep(200);
}
executor.shutdown();
}
private static void kickOffEntry(final int index) {
if (!processEntry.tryAcquire()) return;
executor.
submit(
new Callable<Void>() {
public Void call() throws InterruptedException {
try {
System.out.println("start " + index);
Thread.sleep(1000); // pretend to do work
System.out.println("stop " …Run Code Online (Sandbox Code Playgroud) 我正在使用带有实体框架5的MVC4开发Web应用程序.
我已经创建了通用存储库来访问工作单元的数据库.
拥有以下两个存储库,
这两个表没有相互关联(没有外键关系).
想要通过组合这些存储库来编写查询.是否可以通过组合两个不同的存储库来编写查询?
如果是,请让我知道.
如果我有例如:
$project = new Project(); // Project is a class that extends Eloquent
$project->title;
$project->something;
Run Code Online (Sandbox Code Playgroud)
是否有可能迭代这些属性......像这样:
foreach( $project as $key => $value )
{
echo $key;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试这样做,以实现编辑Eloquent模型的工作单元
我正在尝试为sharepoint 创建一个库(类库),它将使所有sharepoint dll与sharepoint服务器交互,以上传文件,文档并创建文档库和文档集.
现在这个库可以被Web应用程序(asp.net webform或mvc)或控制台应用程序或web api/wcf服务或windows形成任何东西的客户端使用.
所以在这里我对创建存储库模式和工作单元层以便管理客户端上下文对象感到困惑.
我不确定是否允许为每个操作创建客户端上下文,或者是否创建客户端上下文一次并重新使用或是否每次都创建clientcontext.
我有很多搜索,但无法找到任何参考或文章来创建存储库层,就像它创建的方式一样Entity framework DbContext.
我正在使用客户端对象模型(CSOM库),我的库是关于管理文件和元数据的内容管理系统.
我会感激任何帮助:)
更新:在sharepoint域上传文件的示例代码
ClientContext context = new ClientContext("http://SiteUrl"); // Starting with ClientContext, the constructor requires a URL to the server running SharePoint.
context.Credentials = new SharePointOnlineCredentials(username, password);
// The SharePoint web at the URL.
Web myWeb = context.Web;
List myLibrary = myWeb.Lists.GetByTitle("MyProject"); //This is called document library so in sharepoint document Library is the root where …Run Code Online (Sandbox Code Playgroud) unit-of-work ×10
c# ×5
repository ×3
.net ×2
architecture ×1
asp.net-mvc ×1
concurrency ×1
csom ×1
dispose ×1
eloquent ×1
generics ×1
java ×1
laravel ×1
orm ×1
php ×1
soa ×1
transactions ×1