" Newing UP"接口 [英] "Newing up" Interfaces

查看:192
本文介绍了" Newing UP"接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一个前两天,我看到在我之前没有想到的方式被使用CoCl​​assAttribute。

A couple of days ago, I saw the CoClassAttribute being used in a way I haven't imagined before.


[ComImport, CoClass(typeof(Foo)), Guid("787C1303-AE31-47a2-8E89-07C7257B1C43")]
interface IFoo {
    void Bar();
}

class Foo : IFoo {
    public void Bar() {
        Console.WriteLine("Oh retado!");
    }
}



被用作:

being used as:


class CoClassDemo {
    public static void Show() {
        var a = new IFoo();
        a.Bar();
    }
}

这应该因为COM互不正是没有出乎我的意料因为.NET Framework的早期天。我只是通过.net反射COM互操作的代码时,挖没有支付那么多的关注。

That should have not surprised me since COM Interop does exactly that since the early days of the .NET Framework. I simply haven’t paid that much attention when digging through COM Interop code in .NET Reflector.


method public hidebysig static void Show() cil managed
{
    .maxstack 1
    .locals init (
        [0] class ConsoleApplication1.IFoo a)
    L_0000: nop 
    L_0001: newobj instance void ConsoleApplication1.Foo::.ctor()
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: callvirt instance void ConsoleApplication1.IFoo::Bar()
    L_000d: nop 
    L_000e: ret 
}

发生了什么事是说出来COM互操作的背景下,我立刻我设想这个被用作穷人的编译时依赖注入

What happened is that out of the context of COM Interop, I immediately I envisioned this being used as a poor man’s compile time dependency injection.

所有有做的是摆脱对接口的名字传统的我字头(一样COM互操作)的。

All there is to do is get rid of the conventional "I" prefix on the interface's name (as does COM Interop).

那么这将是一个问题改变组件类的属性交换为另一种实现,嘲讽等。

Then it would be a matter of changing the CoClass attribute to swap an implementation for another, mocking, etc.

两个缺点我看到前期都需要重新编译(这几乎是极限测试方案开发时间)及周围循环依赖当接口和实现被部署到不同的程序集的最终问题。

Two drawbacks I see upfront are having to recompile (which pretty much limits testing scenarios to development time) and eventual problems surrounding circular dependencies when interfaces and implementations are deployed to different assemblies.

有没有人打了这个技术?
任何其他缺点? ?
其他用途

Has anybody played with this technique? Any other drawbacks? Other uses?

推荐答案

我知道这让周末至少有两个博客文章 - 的和的 Ayende的

I know this got at least two blog posts on the weekend - mine and Ayende's.

对于大多数代码,这应该仅仅视为一种好奇心。我认为这将是使用这种依赖注入,当建立的IoC / DI框架可以做的工作,以便更好的滥用,所以干脆。

For most code, this should be treated merely as a curiosity. I think it would be an abuse to use this for dependency injection, when established IoC/DI frameworks can do the job so much better, and so simply.

在特定的,这种方法依赖于§17.5的逃生舱口,微软特有的扩展规格...你希望你的代码在运行单?我还没有尝试过,但目前还没有具体的原因,它应该在的GMC /契编译。

In particular, this approach relies on the escape hatch of §17.5, a Microsoft-specific extension to the spec... do you want your code to run on Mono? I haven't tried it, but there is no specific reason that it should compile under gmcs / dmcs.

乔恩过的最好的例子在混凝土中使用它的代码 - 故意嘲讽COM,但这是与.NET 4.0 / 动态玩弄。再次;这并不适用于最普通的代码

Jon had a better example of using it in concrete code - for deliberately mocking COM, but that was for toying with .NET 4.0 / dynamic. Again; this wouldn't apply to most "regular" code.

因此​​,没有; 不这样做 - 它只是一个有趣的一边

So no; don't do it - it is just a fun aside.

这篇关于" Newing UP"接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆