2010-03-09 24 views
1

我试图实施工作/存储库单元模式,如下所述: http://blogs.msdn.com/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx创建具有统一实体框架对象为

这需要每个库接受的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界面。

在过去,我会刚过库构造数据库连接字符串,它会消失,创建一个本地实体框架对象和使用,只是存储库法的寿命。这是不同的,因为我在Unity Resolve语句期间创建了一个实体框架实例作为IUnitOfWork实现,并且它是我需要传递给存储库构造函数的那个​​实例 - 是否可能,如果是这样,怎么做?

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

我不确定我是否已经正确理解了这种模式,并且乐意就实现它的最佳方式提出建议 - 实体框架仍在使用,但如果不是最佳方法,Unity可以被换出。如果我有整个事情倒过来,请告诉我

+0

https://开头blogs.msdn.microsoft.com/adonet/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0/找不到 – Kiquenet 2017-03-23 12:32:05

回答

1

这被改写,并回答了在这里:Unity framework - reusing instance

的解决方案是使用一个ContainerControlledLifetimeManager - 又名辛格尔顿: http://msdn.microsoft.com/en-us/library/dd203242.aspx

+0

***不好主意* **? http://rob.conery.io/2014/03/04/repositories-and-unitofwork-are-not-a-good-idea/ – Kiquenet 2017-03-23 12:33:23

+0

恕我直言,***代码是国王***,更好*好代码示例*以获得更全面的解释。 _References _:[简洁是可以接受的,但更全面的解释更好](http:// stackoverflow。com/help/how-to-answer) *** jonskeet ***,''查克诺里斯'编程' [代码为王,提供相关资源的链接,不要害怕删除(或编辑重度)无用的答案,不要“回答和运行”](https://codeblog.jonskeet.uk/2009/02/17/answering-technical-questions-helpfully/) – Kiquenet 2017-03-23 12:34:31

+0

这是一个非常非常长的时间以前......我应该想象这个框架已经死亡并被埋没了,放在一艘北欧海盗船上,并在2017年的许多月亮湖上烧毁,因此 – TobyEvans 2017-04-04 14:41:21