有没有办法,使用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
答案 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
之前不可用。但是,对于模型第一种方法,也许这可行吗?