自定义实体实现

时间:2013-01-19 08:32:13

标签: entity-framework

有没有办法,使用EF6,注入自定义对象实例创建者? 我需要做的是在美国化之前向EF提供实体实例。

基本上我希望能够使用非参数构造函数来定义我的POCO实体,因此为了能够使用DI aggreate,最终会保留EF。

我知道我可以使用ObjectMaterialized事件来实现类似的东西:

var oc = ( this as IObjectContextAdapter ).ObjectContext;
oc.ObjectMaterialized += ( s, e ) => 
{
   //resolve and inject dependencies here using e.g. public properties  
};

但我真的很想在构造函数上声明依赖项。

有什么想法吗? 干杯, .M

1 个答案:

答案 0 :(得分:4)

使用默认的ObjectContext,我不相信看过EF代码是可能的。最终,对象由ObjectContext.CreateObject创建。这会执行以下两项操作之一:它要么调用默认构造函数,要么如果启用了代理创建,则会创建相关的代理类型。代理类型用于增强的更改跟踪和延迟加载属性。

但是,ObjectContext.CreateObject是虚拟的,因此可以在派生类中覆盖它。该派生类将提供对容器(或生命周期范围)的引用,然后,在重写的CreateObject调用中,这将用于解析实体。

接下来的问题是,如何将派生类型指定为ObjectContext用于DbContext?好吧,DbContext应该使用a constructor that takes an instance of the ObjectContext

这是我的想法开始有点偏离轨道,因为ObjectContext本身需要to be told关于它在连接字符串中使用的模型。我认为这可能意味着代码优先方法不会起作用,因为模型是懒惰创建的,因此在构造DbContext之前不可用。但是,对于模型第一种方法,也许这可行吗?