1

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

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

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

到目前为止,一切都很好。

我想要做的是使用 Unity 框架添加依赖注入。

使用 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 构造函数,然后它就会消失,创建一个本地实体框架对象并仅在 Repository 方法的生命周期内使用它。这是不同的,因为我在 Unity Resolve 语句期间创建了一个实体框架实例作为 IUnitOfWork 实现,并且我需要将该实例传递给存储库的构造函数 - 这可能吗?如果可以,如何?

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

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

4

1 回答 1

1

这在此处被改写并回答:Unity 框架 - 重用实例

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

于 2010-03-09T21:32:10.757 回答