Dependency injection 我的作品采用什么设计模式?

Dependency injection 我的作品采用什么设计模式?,dependency-injection,inversion-of-control,repository-pattern,unit-of-work,persistence-ignorance,Dependency Injection,Inversion Of Control,Repository Pattern,Unit Of Work,Persistence Ignorance,我实现了一个具有持久性的存储库模式。存储库实现仅与我的实体对象、IUnitOfWork和ITable接口交互。其目的是不重用IUnitOfWork,而是表示单个事务。到目前为止,我已经在内存中实现了IUnitOfWork和ITable的Linq到Sql版本 我的问题是,由于IUnitOfWork注入到存储库中,我最终需要知道如何在使用存储库的地方实例化一个新的IUnitOfWork。因为这是应该是可插拔的主要部分,所以感觉我做错了什么。一般使用模式如下所示: FooUnitOfWork unit

我实现了一个具有持久性的存储库模式。存储库实现仅与我的实体对象、
IUnitOfWork
ITable
接口交互。其目的是不重用
IUnitOfWork
,而是表示单个事务。到目前为止,我已经在内存中实现了
IUnitOfWork
ITable
的Linq到Sql版本

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

FooUnitOfWork unitOfWork = new FooUnitOfWork();
Repository repos = new Repository(unitOfWork);
// ...act upon repos
unitOfWork.Save();
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;
    }
}
现在看来,我需要一些其他模式来允许应用程序中的每个存储库使用获得正确的工作单元(例如内存、L2S等)

什么是最合适的模式?我已经看过了,但他的例子似乎没有一个是完全合适的。我已经觉得我所拥有的抽象量比我想要的要多,所以构建另一个间接过程似乎太过了


目前,我倾向于某种应用程序范围内的提供商,可以将其配置为生成正确的
IUnitOfWork
。我是否偏离了基准,或者这才是真正实现不可知的必要条件?

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

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

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

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

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

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

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

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

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

UnitOfWorkFactory.Create();
随着普遍实施:

Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IUnitOfWork>();
Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance();
这使我能够创建一个使用依赖注入的库,而不必强制所有用户使用相同的IoC框架


也许我应该使用一个非常简单的工厂,在那里我可以设置回调?它可以有一组静态方法,如下所示:

FooUnitOfWork unitOfWork = new FooUnitOfWork();
Repository repos = new Repository(unitOfWork);
// ...act upon repos
unitOfWork.Save();
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;
    }
}
公共静态类UnitOfWorkFactory
{
私有静态函数FactoryMethod;
公共静态IUnitOfWork创建()
{
if(UnitOfWorkFactory.FactoryMethod==null)
{
抛出新的InvalidOperationException(“…”);
}
返回UnitOfWorkFactory.FactoryMethod();
}
公共静态void SetFactoryMethod(Func工厂)
{
UnitOfWorkFactory.FactoryMethod=工厂;
}
}

这个坏在哪里?

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

UnitOfWorkFactory.Create();
随着普遍实施:

Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IUnitOfWork>();
Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance();
这使我能够创建一个使用依赖注入的库,而不必强制所有用户使用相同的IoC框架


也许我应该使用一个非常简单的工厂,在那里我可以设置回调?它可以有一组静态方法,如下所示:

FooUnitOfWork unitOfWork = new FooUnitOfWork();
Repository repos = new Repository(unitOfWork);
// ...act upon repos
unitOfWork.Save();
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;
    }
}
公共静态类UnitOfWorkFactory
{
私有静态函数FactoryMethod;
公共静态IUnitOfWork创建()
{
if(UnitOfWorkFactory.FactoryMethod==null)
{
抛出新的InvalidOperationException(“…”);
}
返回UnitOfWorkFactory.FactoryMethod();
}
公共静态void SetFactoryMethod(Func工厂)
{
UnitOfWorkFactory.FactoryMethod=工厂;
}
}

这在哪里分解?

好吧,您需要一个上下文来关联工作单元(例如线程或httpcontext),然后需要使用工厂方法来获取工作单元(vs new())。静态工厂方法(由线程上下文支持)将是一个干净的实例化接口。如何设置我当前在
UnitOfWork
构造函数中设置的配置(DB上下文等)?如果这是一个web应用程序,我会在某些地方进行创作。。您将处理BeginRequest并创建一个工作单元(传递所有依赖项和配置),然后将其保存在某个位置(最简单的方法是全局中的实例成员或项目集合中),然后您将拥有一个工厂方法(或类似方法),该方法将知道在何处查找工作单元实例。。。你可以做一些更复杂的事情,但实际上你所做的只是设置一个服务……我倾向于使用
IUnitOfWorkFactory。创建
类型模式,因为我无法为应用程序创建单个
IUnitOfWork
。存在线程问题,对于Linq to Sql实现,建议不要将
DataContext
对象保留太长时间。好的,您需要一个上下文来关联工作单元(例如线程或httpcontext),然后需要使用工厂方法来获取工作单元(vs new())。静态工厂方法(由线程上下文支持)将是一个干净的实例化接口。设置配置(DB上下文等)如何我目前在
UnitOfWork
构造函数中设置了什么?我会在某些地方处理这个问题,例如,如果这是一个web应用程序。您可以处理BeginRequest并创建一个工作单元(传递所有依赖项和配置),然后将它保存在某个地方(最简单的方法是全局或Items集合中的实例成员),然后您将拥有一个工厂方法(或类似的方法),该方法将知道在何处查找工作单元实例