2011-11-11 82 views
4

我最近發現可以通過裝飾與CoClassAttribute的接口來指定默認實現"new up" an interface in C#(ab)使用CoClassAttribute爲接口提供默認實現可以嗎?

[ComImport, Guid("579A4F68-4E51-479A-A7AA-A4DDC4031F3F"), CoClass(typeof(FooImpl))] 
public interface IFoo 
{ 
    void Bar(); 
} 

public class FooImpl : IFoo 
{ 
    public void Bar() { } 
} 

... 

// Constructs a FooImpl 
IFoo foo = new IFoo(); 

我知道,這個功能的存在主要是爲支持COM的互操作,但我想知道,這將是在通用類的庫默認實現接口相關聯的合理方法。

我有兩個問題:

  1. 是否有與這個產品的陷阱?我不是COM-interop的專家,我不知道這是否會對POCO產生任何負面影響。我沒有進行任何主要測試,但是我的例子中的IL似乎沒問題(上的正常newobj指令,而不是調用Type.GetTypeFromCLSIDActivator.CreateInstance)。

  2. 即使這樣做會順利進行,是否還有其他原因(比如從API設計的角度來看)來避免這種情況?

+0

因爲您正在使用Windows特定的東西,所以代碼可能會打破單聲道實現。 – Femaref

+0

我可以通過關門聽到wtfs的攻擊,應該有足夠的理由。你最好介紹一下。 –

+0

這實際上是否完成了工廠無法做到的任何事情? –

回答

-2

使用智能感知評論:

/// <summary> 
    /// Explain here all about interface 
    /// </summary> 

而不是黑客攻擊的屬性,因爲它可能會在使用你的類別人的半反射實現適得其反。屬性是由那些使用反射的工具使用的,intelisense是用於文檔的。當然,一些傳統工具在閱讀你的///評論時會遇到問題,但他們也不能讀取你的屬性。

+0

這個問題不是關於註釋,而是接口的默認實現。 –

+0

不錯,投下一個相互競爭的答案總是很好,但是我很感謝你沒有匿名這樣做。無論如何,問題是。「這樣做有什麼困難嗎?」我回答了它,並提出了一個解決方法來解決他的問題... – zmilojko

2

不應該這樣做的關鍵原因是您正在開始對不需要它的對象實例的COM生命週期管理。 .NET現在必須做一些COM互操作,包括安全堆棧散步,公寓線程檢查和addref/release東西。相反,我會考慮查看依賴注入(控制模式的反轉)和Common Service Locator模式。我會專注於理解構造函數注入,因爲它是依賴管理的首選模式。

這是我在圖書館做的事情。比方說,我想寫一個日誌服務(人爲的例子)。我想有兩個核心組件:

MyStuff.Logging.Contracts - 這裏就是我會宣佈ILogger接口 MyStuff.Logging - 這裏就是我會寫不同的日誌實現我可能會像FileLogger,DatabaseLogger等

然後在我的應用程序中,我將使用Ninject或Unity(DI容器)將ILogger與默認實現相關聯。

+0

感謝你。即使在純.NET環境中,運行時是否真的會做所有這些事情,僅僅是因爲這些屬性存在?你能提供一些關於這方面的信息嗎? – Ani

+0

看看這個:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comimportattribute.aspx。 「ComImportAttribute是一個僞自定義屬性,用於指示在以前發佈的類型庫中定義了一個類型。公共語言運行庫在激活,導出,強制等時對待這些類型。」 –

+0

雖然使用new運算符最終只會調用構造函數。我認爲運行時將不得不進行生命週期管理和線程化的公寓管理,否則該類實際上不是COM對象。 –

相關問題