2010-09-09 167 views
1

我有一個基於Prism(v4 ctp)和MEF的應用程序。 該應用程序有一個服務IService1。我希望此服務實現由某個模塊導出(不僅僅由MEF發現)棱鏡+ MEF:延遲棱鏡模塊的服務出口

public interface IService1 {} 
public class Service1Impl: IService1 {} 

Service1Impl沒有ExportAttribute。這種因爲我想手動創建實現我的棱鏡模塊:

[ModuleExport(typeof(SomeModule))] 
[PartCreationPolicy(CreationPolicy.Shared)] 
public SomeModule: IModule 
{ 
    [Export] 
    public IService1 Service1 {get; private set} 

    public void Initialize() 
    { 
     Service1 = new Service1Impl(); 
    } 
} 

在我想通過MEF導入IService1的實現一些其他組件。 問題是如何在Prism調用Initialize之後告訴MEF執行導出操作(在SomeModule中)?

如果我在模塊的構造函數中創建服務的實現,那麼一切正常,但它與Prism的模塊初始化過程不一致。 事情是,在MEF的作文完成後,Prism會初始化模塊。 此外,在創建服務的實現之前,我需要執行一些複雜的初始化邏輯,我不希望它在構造函數中。

那麼,我有什麼選擇?

回答

1

您是否試過ModuleDependency?我需要對MEF進行更多的研究,但是在Prism中,可以保證一個Module的Initialize通過ModuleDependency在其他模塊之前觸發。例如,如果您在Initialize期間需要一個IService1的SomeOtherModule,則可以確保以這種方式初始化SomeModule。

[ModuleDependency("SomeModule")] 
public class SomeOtherModule : IModule 
{ 
    [Import] 
    public IService1 Service1 {get; set;} 

    public void Initialize() 
    { 
     //This ought to be populated now. 
     Service1.DoSomething(); 
    } 
} 

我說我可能不知道MEF的一些內部工作不允許這種完全有資格這一點,但是這是怎麼會事與棱鏡一般工作。

順便說一句,當我看到的依賴,無論是顯式或隱式的,我問自己:

  1. 會服務由多個模塊一起使用?那麼是否有意義的將服務推廣爲Bootstrapper中構建的並由託管應用程序提供而不是另一個模塊?
  2. 如果不是#1,如果模塊之間存在依賴關係,這些模塊在邏輯上是否相同?他們應該結合?如果一個人不能沒有另一個生活,那麼沒有幾個理由不把它們結合起來。

無論如何,最後只是想一想。

希望這會有所幫助。

+0

謝謝,但說實話,我不喜歡這種做法,因爲它創造了誰出口服務,誰服務進口模塊組件之間的依賴性。我相信這並不好。 – Shrike 2010-09-23 16:55:19

+0

@Shrike你已經有一個隱式的依賴。您希望服務實現由另一個模塊提供,並且如果它不在那裏,則某些部分流程會失敗。這就是爲什麼我發佈「作爲一邊」部分......你需要解決你的模塊之間的依賴關係。我也不喜歡ModuleDependency,但是您必須以某種方式解決隱含的依賴關係。如果不是ModuleDependency,那麼我列出的其他方法之一。 – 2010-09-23 19:14:01

0

我對我的MEF用法有點生疏,但這些想法可能會有用。如果你的財產是concreate實現類型的,但你通過一個出口合同屬性指定接口(我認爲這是類似於以下):

[Export(IService1)] 
public Service1Impl Service1 {get; private set} 

然後每一個有一個進口檢查模塊IService1接口將從該模塊中獲得具體的實現(這是針對接口進行編碼的主要目標)。

我希望這可以引導您朝着正確的方向發展。

感謝, 達米安