什么样的设计模式来定位我的IUnitOfWork?
题
我已经实现具有持久性无知的存储库的图案。该仓库实现只用我的实体对象,IUnitOfWork
和ITable<T>
界面的交互。我们的目的是,IUnitOfWork
不重用,但代表一个单独的事务。到目前为止,我在内存以及的LINQ到SQL版本IUnitOfWork
和ITable<T>
已经实现。
我的问题是,由于IUnitOfWork
注入到库,我最终需要知道如何实例化一个新的IUnitOfWork
何地使用存储库。由于这是应该是可插拔的感觉我做错了什么的主要部分。一般使用模式是这样的:
FooUnitOfWork unitOfWork = new FooUnitOfWork();
Repository repos = new Repository(unitOfWork);
// ...act upon repos
unitOfWork.Save();
现在看来,我需要一些其它图案,以允许在该应用中的每个库的使用,以获得正确的工作单元(例如,在存储器,L2S,等)。
什么是这个最恰当的模式?我看的福勒的话题但没有他的例子讨论,似乎是一个清洁的选择。我已经觉得我有比我更想使建筑又间接似乎过度抽象的量。
目前,我倾向于某种应用范围的提供者,其可以被配置为产生正确的IUnitOfWork
。我是关闭基地,或者这是需要什么来真正地执行不可知?
解决方案
更新:虽然这并没有真正打破它结束了刚刚生产,穷人的IOC容器。我结束了刚刚更换所有的这些:
UnitOfWorkFactory.Create();
与广义普通的服务定位器实现:
Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IUnitOfWork>();
这让我创建一个使用依赖注入不强制所有用户都使用相同的IoC框架库。
也许我应该用一个很简单的工厂在哪里可以设置回调?它可以具有一组在其上的静态方法是这样的:
public static class UnitOfWorkFactory
{
private static Func<IUnitOfWork> FactoryMethod;
public static IUnitOfWork Create()
{
if (UnitOfWorkFactory.FactoryMethod == null)
{
throw new InvalidOperationException("...");
}
return UnitOfWorkFactory.FactoryMethod();
}
public static void SetFactoryMethod(Func<IUnitOfWork> factory)
{
UnitOfWorkFactory.FactoryMethod = factory;
}
}
在哪里这打破?
其他提示
我建议使用一个位访客图案来发现IUnitOfWork接口的实施方式。
[UnitOfWork(Name="foo")]
public class FooUnitOfWork : IUnitOfWork {}
Repository repo = new Repository("foo");
//stuff happens
repo.Save(); //or repo.Worker.Save();
在回购实例发现工厂发现工人和创建它。
不隶属于 StackOverflow