我已经实现具有持久性无知的存储库的图案。该仓库实现只用我的实体对象,IUnitOfWorkITable<T>界面的交互。我们的目的是,IUnitOfWork不重用,但代表一个单独的事务。到目前为止,我在内存以及的LINQ到SQL版本IUnitOfWorkITable<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();

在回购实例发现工厂发现工人和创建它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top