使用Unity为工作单元/存储库模式创建实体框架对象

时间:2010-03-09 08:46:49

标签: c# .net entity-framework repository-pattern unit-of-work

我正在尝试实现工作单元/存储库模式,如下所述: http://blogs.msdn.com/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx

这要求每个Repository接受IUnitOfWork实现,例如使用部分类扩展的EF datacontext以添加IUnitOfWork接口。我实际上使用的是.net 3.5,而不是4.0。我的基本数据访问构造函数如下所示:

public DataAccessLayer(IUnitOfWork unitOfWork,
                       IRealtimeRepository realTimeRepository)
{
    this.unitOfWork = unitOfWork;
    this.realTimeRepository = realTimeRepository;
}

到目前为止,非常好。

我要做的是使用Unity Framework添加依赖注入。

使用Unity创建EF数据上下文是一个冒险,因为它无法解析构造函数 - 我最终做的是在我的部分类中使用新的重载构造函数创建另一个构造函数,并用[InjectionConstructor]

[InjectionConstructor]
public communergyEntities(string connectionString, string containerName)
    : this()
{
    // ...
}

(我知道我需要将连接字符串传递给基础对象,这可以等到我正确初始化所有对象之后)

因此,使用这种技术,我可以愉快地将我的实体框架对象解析为IUnitOfWork实例:

using (IUnityContainer container = new UnityContainer())
{
    container.RegisterType<IUnitOfWork, communergyEntities>();

    container.Configure<InjectedMembers>()
        .ConfigureInjectionFor<communergyEntities>
            (new InjectionConstructor("a", "b"))

    DataAccessLayer target = container.Resolve<DataAccessLayer>();

    // ...
}

大。我现在需要做的是创建对DataAccessLayer的存储库对象的引用 - DAL只需要知道接口,所以我猜我需要将它作为Unity Resolve语句的一部分进行实例化,并将其传递给它IUnitOfWork接口。

过去,我只是将Repository构造函数传递给db连接字符串,它就会消失,创建一个本地Entity Framework对象,并将其用于Repository方法的生命周期。这是不同的,因为我在Unity Resolve语句中创建了一个实体框架实例作为IUnitOfWork实现,并且我需要将该实例传递到存储库的构造函数中 - 这是可能的,如果是的话,如何实现?

我想知道我是否可以将Repository设为属性并将其标记为依赖关系,但这仍然无法解决如何使用DAL正在解决的IUnitOfWork对象创建存储库的问题

我不确定我是否正确理解了这种模式,并且很乐意就实施它的最佳方式提出建议 - 实体框架仍然存在,但如果不是最佳方法,Unity可以被换掉。如果我把整件事颠倒过来,请告诉我

1 个答案:

答案 0 :(得分:1)

这被重新描述并在这里回答:Unity framework - reusing instance

解决方案是使用ContainerControlledLifetimeManager - 又名Singleton: http://msdn.microsoft.com/en-us/library/dd203242.aspx