2015-10-19 45 views
1

底部的代碼來自正在工作 WPF示例應用程序使用Autofac進行依賴注入。 我想轉換爲最新版本的MEF。我還安裝了NuGet軟件包CommonServiceLocator(V. 1.3)和Prism.Core,Prism.Mef和Prism.Wpf(全部6.1)。 當我做MEF可以解析返回接口的Func委託嗎?

var provider = ServiceLocator.Current.GetInstance<FriendDataProvider>(); 

我得到一個ActivationException從FriendDataProvider的構造函數的「FUNC。」聲明。 MEF能做到這一點嗎?如果是,需要什麼屬性聲明?

[Export] 
public class FriendDataProvider 
{ 
    private readonly Func<IDataService> _dataServiceCreator; 

    [ImportingConstructor] 
    public FriendDataProvider(Func<IDataService> dataServiceCreator) // <= DI ERROR 
    { 
     _dataServiceCreator = dataServiceCreator; 
    } 

    public void DoSomething() 
    { 
     using (var service = _dataServiceCreator()) // Factory 
     {   } 
    } 
} 

[Export(typeof(IDataService))] 
public class DataService : IDataService 
{ 
    public ClassA GetSomething() 
    { 
     return new ClassA(); 
    } 

    public void Dispose() 
    {  } 
} 


public interface IDataService : IDisposable 
{ 
    ClassA GetSomething(); 
} 

public class ClassA 
{ } 

回答

1

最有可能你正在尋找MEF ExportFactory類: https://msdn.microsoft.com/en-us/library/ff382807(v=vs.110).aspx

It'a擁有<的混合物>和Func鍵<>從AutoFac想法。注意ExportFactory.CreateExport返回一次性的ExportLifetimeContext。處置導出生命週期還將處理注入的部分及其所有依賴關係。根據所有者部分的實例化模式,ExportFactory行爲稍有不同。如果所有者類是單例,ExportFactory將始終爲您創建新實例(行爲與Func <在Autofac中擁有< T >>),但如果將它與CompositionScopes結合使用,您將在AutoFac中獲得類似於Func < T>的行爲。見例如:http://blogs.microsoft.co.il/bnaya/2013/01/16/mef-20-mini-series-part-6-composition-scoping-and-lifetime-management/

這裏就是你們的榜樣重新編寫使用ExportFactories:

[Export] 
public class FriendDataProvider 
{ 
    private readonly ExportFactory<IDataService> _dataServiceCreator; 

    [ImportingConstructor] 
    public FriendDataProvider(ExportFactory<IDataService> dataServiceCreator) // <= DI ERROR 
    { 
     _dataServiceCreator = dataServiceCreator; 
    } 

    public void DoSomething() 
    { 
     using (var service = _dataServiceCreator.CreateExport()) // Factory 
     { 

     } 
    } 
} 

[Export(typeof(IDataService))] 
public class DataService : IDataService 
{ 
    public ClassA GetSomething() 
    { 
     return new ClassA(); 
    } 

    public void Dispose() 
    { } 
} 


public interface IDataService : IDisposable 
{ 
    ClassA GetSomething(); 
} 

public class ClassA 
{ } 
+0

我可能要深入挖掘生命週期管理,但使用ExportFactory&CreateExport()使代碼運行正常爲止。非常感謝您的幫助! – ChrisK