有没有人对LINQ to SQL的工作单元模式的实际示例有任何好的联系
我什么时候会在NHibernate已经提供的东西之上编写UoW实现?有真实世界的例子吗?
我有一个特定的场景,根据一些约束在多个表上完成插入和更新......所以很自然地将事务范围用于这些场景。现在,我有一个存储库层和一个服务层。服务层调解存储库和 UI,并且是持久的无知。现在我很困惑在哪里使用服务或存储库层中的事务。我没有使用任何 ORM。我也看到有人在这种情况下提倡使用工作单元模式。有没有适合我当前场景的工作单元模式示例,我看到的所有示例都使用 ORMS。
谢谢,
我们即将启动一个类似于前一个项目的新项目.我可以复制旧设计,但我对旧设计并不十分满意.
它是一个"标准"业务系统(销售,盘点,仓储等),构建在.Net 3.5(Winforms MDI)的后端,后端有Entity Framework.
所有表单都继承自baseform(继承Windows.Form).该表单公开了一个名为ObjectContext的属性,该属性在第一次调用时实例化一个新的ObjectContext.我认为这构成了一个非常好的UnitOfWork,在每种形式中都隔离了所有数据访问.
然而.
我已经将所有查询和常见CRUD封装在"可怜的勒芒存储库"中.这些存储库作为ObjectContext的属性公开.
因此,如果我想绑定并命令表单,我将调用OrderLinesGrid = ObjectContext.OrderRepository.GetOrderLinesByID(orderID).
OrderRepository获取对为表单创建的objectcontext的引用,如下所示
(在我的部分ObjectContext类中)
Private _OrderRepository as OrderRepository
Public ReadOnly Property OrderRepository as OrderRepository
Get
if _orderrepository is nothing then
_orderrepository = New OrderRepository(me)
end if
return _orderrepository
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个是:
对存储库的调用是通过ObjectContext进行的.因此,我没有得到查询和我想要的dataaccesslayer之间的抽象.
对于我的域中的每个新类型,我需要在ObjectContext中创建一个属性
我对OrderRepository的调用应该只返回域对象,而不用担心它是如何持久化的.此外,我不能让每个存储库拥有它自己的ObjectContext,因为这需要我在引用时附加和分离对象,即Country到Order.Country属性.
我很感激有关此设计的任何想法和反馈:)
abstraction entity-framework unit-of-work repository-pattern winforms
我正在考虑使用EF 4开始一个新项目并阅读一些文章,我发现了一篇关于EF与存储库模式和工作单元的文章(http://blogs.msdn.com/b/adonet/archive/2009/ 06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx)
查看该文章,它使用ObjectContext作为UnitOfWork,并将其传递给Repository.
我的问题是,如果我有2个ObjectContext,这意味着我将有2个工作单元,但我实际上希望在这两个上下文上执行的所有操作都是一个单独的工作单元,这种情况是否可行?我不想在每个上下文中调用save,我希望它是事务性的....不使用事务管理器...
例如,我有一个管理操作日志的上下文和管理订单的另一个上下文.让我们说在我的业务层,我有一个名为AddOrder()的方法.AddOrder()将使用订单上下文创建新订单,但它也将使用操作日志上下文来创建新的操作日志条目.由于那些是2个上下文,我将不得不在两个上下文中调用save来提交....也许唯一的选择是只有一个上下文....
编辑:我的意思是2个不同类型的上下文,例如:OperationalLogContext和OrderContext.
在DDD中,聚合根可以具有存储库.让我们采用Order聚合,它是非持久的对应OrderRepository和持久对应的OrderUoW.我们还有ProductVariant聚合,它跟踪订单中产品的库存.它可以有ProductVariantRepository和ProductVariantUoW.
Order和ProductVariant的工作方式是在订单持久化之前,检查库存.如果有库存,则通过调用OrderUoW.Commit()来保持订单.是的,接下来将调用ProductVariantUoW.Commit()来更新产品的库存.
不幸的事情可能会变坏,用户在短时间内购买相同的产品(将其视为两个用户购买相同产品的网络应用程序).现在,第二个用户的整个事务应该通过还原刚刚创建的订单而失败.我应该调用OrderUoW来回滚更改(应该从数据库中删除顺序)吗?或者我应该将两个UoW.Commit()操作放在事务范围中,因此一个commit()失败会回滚更改吗?或者两个存储库(Order,ProductVariant)应该只有UoW并且它只需要一个事务范围?
我可以通过说明如何处理涉及多个存储库的事务来简化故事?
We are developing a website that uses the repository pattern/unit of work approach. We use Autofac to assist with the construction of objects between these tiers of abstraction.
I've written an AutoFac authentication filter that currently grabs Basic Auth headers and creates an IPrincipal object and assigns it to HttpContext.Current.User
In our custom DbContext class I want Autofac to get a copy of this IPrinipal object without having to look into System.Web.HttpContext (in an effort to keep this decoupled)
有没有人对我如何让 …
asp.net-mvc dependency-injection unit-of-work autofac repository-pattern
在我的symfony2/doctrine2应用程序中,我有一个奇怪的情况,当持久化修改后的实体时,更改不会刷新到数据库,我无法理解为什么.
以下是我的代码:
$date = $subscription->getPaymentValidUntil()->format('d/m/Y');
$period = $payment->getDetail('period');
$validDate = $subscription->getPaymentValidUntil()
->add(new\DateInterval($period == Subscription::MONTH ? 'P1M' : 'P1Y'))
;
$subscription->setPaymentValidUntil($validDate);
$this->em->persist($subscription);
exit(var_dump(array(
$date,
$this->em->getUnitOfWork()->getScheduledEntityUpdates(),
$subscription->getPaymentValidUntil(),
)));
$this->em->flush();
Run Code Online (Sandbox Code Playgroud)
vardump的输出如下:
array (size=3)
0 => string '12/05/2015' (length=10)
1 =>
array (size=0)
empty
2 =>
object(DateTime)[2295]
public 'date' => string '2015-06-12 18:52:37' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/Paris' (length=12)
Run Code Online (Sandbox Code Playgroud)
如果我在vardump之前刷新或删除vardump,事实上,我的数据库中的日期值不会改变.为什么?
正如您所看到的,我将这个日期值添加一个月,它反映在实体中,但它没有安排更新.我怎么解决这个问题?
编辑:我已经深入了解实体管理器持久化函数,我发现当在Doctrine\ORM\EntityManager :: persist中转储实体时,日期很好,但是当它在Doctrine\ORM\UnitOfWork :: persist中转储时,日期以某种方式重置了原来的:
Doctrine\ORM\EntityManager::persist :转储更新的实体
public function persist($entity)
{
if ( ! is_object($entity)) {
throw …Run Code Online (Sandbox Code Playgroud) 我将 Doctrine 用于 Typ3/cms 项目以增强后端工作流程的功能。
所以我不得不自己引导教义。它的大部分内容都非常简单,我完全没有问题。但是当谈到坚持一个现有的实体时,我很挣扎。每次我坚持一个现有实体时,它都会被创建为一个新实体。
经过一番挖掘,我得出结论,这不是“UnitOfWork”的一部分(->contains(entity) == false)。如果我在这个单元内手动注册,一切又正常了。
$this->entityManager->getUnitOfWork()->registerManaged($page, array('uid' => $page->getUid()), array('title' => $page->getTitle()));
Run Code Online (Sandbox Code Playgroud)
但这不可能是故事的结局..所以我仍然试图弄清楚我的学说有什么问题:D
为什么我提取的实体不受管理?
这是我的 DoctrineLoader:
private function createEntityManager()
{
global $GLOBALS;
$paths = array(
MyT3Extension::rootDir() . '/Configuration/ORM'
);
$isDevMode = true;
$typoDbConfig = $GLOBALS['TYPO3_CONF_VARS']['DB'];
// the connection configuration
$dbParams = array(
'driver' => 'pdo_mysql',
'user' => $typoDbConfig['username'],
'password' => $typoDbConfig['password'],
'dbname' => $typoDbConfig['database'],
'charset' => 'utf8'
);
$config = Setup::createYAMLMetadataConfiguration($paths, $isDevMode, MyT3Extension::rootDir() . '/Cache');
$entityManager = EntityManager::create($dbParams, $config);
return $entityManager;
}
Run Code Online (Sandbox Code Playgroud)
orm 模型的 Yml 定义: …
I have implemented Repository pattern with Unit of work but have some architectural issues.
For example, lets say I am creating a used car parts online store. While I have operations on my DB I also have operations I need to perform on remote API's from different scrap yards e.g. need to run searches, availability updates and more...
I decided to try unit of work and repository pattern
Did things mostly like Mosh Hamedani but for asp.net core 2.1 …
unit-of-work ×10
doctrine-orm ×2
php ×2
symfony ×2
.net ×1
abstraction ×1
asp.net-core ×1
asp.net-mvc ×1
autofac ×1
c# ×1
linq-to-sql ×1
nhibernate ×1
transactions ×1
typo3 ×1
unit-testing ×1
winforms ×1