疑惑

前段时间一直再用Entity Framework 6,写了一些公用的方法,在这个过程中发现了DbContext实现的接口IObjectContextAdapter,可以通过这个接口访问到更底层的ObjectContext对象,比如

((IObjectContextAdapter)ctx).ObjectContext

当时就觉得很奇怪,为什么不能直接获取,而需要一次转换,主要是奇怪C#是通过什么形式把ObjectContext给hide住的,不过当时也没多想,忙于完成工作。最近比较系统的再过C#知识点的时候,发现了Explicit Interface implementation, 回想起了这个之前的那个疑惑,又去看了一下才发现,原来就是基于这个原理,其实是一个C#特别常见的功能,当你在实现某些接口的时候,IDE就已经告诉你了是隐示实现接口(implicit implementation)还是显示实现接口(explicit implementation)。

关于 Explicit interface implementation

简单的一句话就是,如果你想用接口当中的成员,必须使用接口本身的一种实现方式,使用这种方式可以为一些特定的情况而隐藏特定的实现,比如说要实现两个接口InterfaceA,InterfaceB,这两个接口中有相同的成员方法,实现类里边就可以共存了。

public interface InterfaceA
{
void Test();
} public interface InterfaceB
{
void Test();
} public class RunTest : InterfaceA, InterfaceB
{ void InterfaceB.Test()
{
throw new NotImplementedException();
} void InterfaceA.Test()
{
throw new NotImplementedException();
}
}

以这种方式实现后,实现类的实例是不能直接方法成员方法的。

DbContext 实现 IObjectContextAdapter

通过ILSpy反编译EntityFramwork.dll,并且查找DbContext后,就能看到实现IObjectContextAdapter的情况

/// <summary>
/// Returns the Entity Framework ObjectContext that is underlying this context.
/// </summary>
/// <exception cref="T:System.InvalidOperationException">Thrown if the context has been disposed.</exception>
[SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
ObjectContext IObjectContextAdapter.ObjectContext
{
get
{
this.InternalContext.ForceOSpaceLoadingForKnownEntityTypes();
return this.InternalContext.ObjectContext;
}
}

是以explicit implementation的方式实现的接口,并且不直接暴露给外部,所以这也就是为什么Entity Framework 6更希望你用DbContext这种封装了N层的类,而不希望你在通常的情况下用更底层的类,但如果要用只能通过IObjectContextAdapter本身来调用这个成员。

DbContext 中的 Explicit interface implementation的更多相关文章

  1. C# explicit interface implementation(显式接口实现)

    C# explicit interface implementation 某个类要实现两个包含相同方法名的接口, 应该如何实现这两个方法? namespace ExplicitInterfaceImp ...

  2. Explicit Interface Implementation (C# Programming Guide)

    https://msdn.microsoft.com/en-us/library/ms173157.aspx If a class implements two interfaces that con ...

  3. iOS开发—在@interface,@implementation和@property中变量的定义

    一直搞不懂在OC中变量在@interface和@implementation中有什么区别,定义@property又有什么不同,查了很多资料,总结如下: //ViewController.h @inte ...

  4. 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图

    这个教程是从UE4 Wiki上整理而来. 在C++中直接使用Interface大家应该很熟悉.只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数.像这样的虚函数的基类一般概念上叫接口.那 ...

  5. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  6. 在EF4.1的DBContext中实现事务处理(BeginTransaction)和直接执行SQL语句的示例

    在EF4.1的DBContext中实现事务处理(BeginTransaction)和直接执行SQL语句的示例 (2012-03-13 10:12:48) 转载▼   public ActionResu ...

  7. C++中的explicit关键字的用法

    一.explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. 二.explicit使用注意事项: ...

  8. EF Core中如何取消跟踪DbContext中所有被跟踪的实体

    首先定义一个DbContext的扩展类DbContextDetachAllExtension,其中包含一个DbContext的扩展方法DetachAll,用来取消跟踪DbContext中所有被跟踪的实 ...

  9. C++中关键字explicit的作用

    C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色. 1 是个构造器 ,2 是个默认且隐含的类型转换操作符. 所以, 有时候在我们写下如 AAA ...

随机推荐

  1. Dubbo分布式服务子系统的划分

    一.划分子系统的策略 按照系统的业务模块的独立性划分 二.划分时服务子系统的数量的控制 过多:可能划分过细,破坏业务子系统的独立性,部署维护工作量大,独立进程占用内存多 过少:没能很好的解耦,开发维护 ...

  2. Centos7 创建本地 docker 仓库极其遇到的问题

    环境安装: VirtualBox 安装 Centos7 安装 docker 1. 配置私有仓库和客户端地址 私有仓库:192.168.1.104 客户端:192.168.1.103 通过 Centos ...

  3. Docker镜像加速

    安装好Docker后接下来就是愉快的玩耍了,可是实际情况并不愉快 因为docker的默认镜像源在国外,鉴于国内特殊的网络原因访问起来往往很慢或者完全访问不了,幸好国内有类似的镜像源可以使用,我使用的是 ...

  4. python中strip函数的用法

    python中往往使用剥除函数strip()来对用户的输入进行清理.strip函数的最一般形式为: str.strip('序列') 其中,序列是一段字符串,该函数表示从头或者从尾部开始进行扫描,如果扫 ...

  5. JS表单提交的几种方式

    第一种方式 : 表单提交,在 form 标签中增加 onsubmit 事件来判断表单是否提交成功 <script type="text/javascript"> fun ...

  6. strut2-学习笔记(二)

     Struts2学习笔记(二) 1. 自定义结果视图的类型(结果视图类型的应用) CAPTCHA图像(随机验证码图像) 实现步骤: (1)编写一个类实现com.opensymphony.xwork ...

  7. Java web 学习笔记 Html CSS 小节

     HTML (Hyper Text Markup Language): HTML就是超文本标记语言的简写,是最基础的网页语言 HTML的版本: 2.0(IETF) 3.0(W3C) 4.01(W3 ...

  8. C语言 流缓冲

    **From : https://www.gnu.org/software/libc/manual/html_node/Stream-Buffering.html** 12.20 流缓冲 通常情况下, ...

  9. 【转载】quickLayout.css-快速构建结构兼容的web页面

    文章转载自 张鑫旭-鑫空间-鑫生活 http://www.zhangxinxu.com/wordpress/ 原文链接:http://www.zhangxinxu.com/wordpress/?p=4 ...

  10. Java继承--子父类中的构造函数

    子父类中的构造函数的特点: 1.在子类构造对象时,发现,访问子类构造函数时,父类构造函数也运行了.   原因是:在子类的构造函数中第一行有一个默认的隐式语句. super(); 类似于this(); ...