1

我已经实现了一个不知道持久性的存储库模式。存储库实现仅与我的实体对象IUnitOfWorkITable<T>接口交互。目的是IUnitOfWork不重用,而是代表单个事务。到目前为止,我已经实现了 in-memory 以及 Linq-to-Sql 的IUnitOfWorkand版本ITable<T>

我的问题是,由于IUnitOfWork注入到存储库中,我最终需要知道如何IUnitOfWork在使用存储库的地方实例化一个新的。由于这是应该可以插入的主要部分,所以感觉就像我做错了什么。一般的使用模式是这样的:

FooUnitOfWork unitOfWork = new FooUnitOfWork();
Repository repos = new Repository(unitOfWork);
// ...act upon repos
unitOfWork.Save();

现在看来,我需要一些其他模式来允许应用程序中的每个存储库使用来获得正确的工作单元(例如内存中、L2S 等)。

最适合这个的模式是什么?我看过福勒关于这个话题的讨论,但他的例子似乎都不是完全合适的。我已经觉得我拥有的抽象量比我想要的要多,所以构建另一个间接性似乎过度了。

目前,我倾向于某种应用程序范围的提供程序,它可以配置为生成正确的IUnitOfWork. 我是偏离基地还是这是真正实现不可知论所需要的?

4

2 回答 2

1

更新:虽然这并没有真正崩溃,但它最终只是产生了一个穷人的 IoC 容器。我最终只是替换了所有这些:

UnitOfWorkFactory.Create();

使用通用的Common Service Locator实现:

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;
    }
}

这在哪里崩溃?

于 2009-08-31T00:02:00.487 回答
0

我建议使用 Vistor 模式来发现 IUnitOfWork 接口的实现。

[UnitOfWork(Name="foo")]
public class FooUnitOfWork : IUnitOfWork {}

Repository repo = new Repository("foo");
//stuff happens
repo.Save(); //or repo.Worker.Save();

在 repo 实例中,发现工厂找到并创建了 worker。

于 2009-08-30T23:56:41.150 回答