2011-06-22 70 views
1

我想與我的WCF數據服務(OData)使用Unity。我有代碼看起來像這樣:(無論是真實的PatientRepository或僞造的一個,我使用的測試)統一和OData(WCF數據服務)

public class PatientService : DataService<IPatientRepository> 

我想團結注入了IPatientRepository在運行時正確的對象

我有完成:

IUnityContainer container = new UnityContainer(); 
container.RegisterType<IPatientRepository, MyEntities>(); 

但是當我運行我得到:

服務器遇到錯誤處理請求。異常消息是'無法創建數據提供者。在'PatientService.PatientService'中爲數據源輸入'RepositoryInterfaces.IPatientRepository'是抽象的。'

有沒有辦法注入這種依賴性?或者我必須把真正的課程放在那個地方?

回答

0

WCF Data Services不知道你的容器,因此不能調用它來找出你傳遞的接口的實現。

同樣,您的Container可以執行構造函數注入,但不能在DataService中動態指定T <T>。

所以據我所知,沒有辦法使用DataService與接口,然後注入一個實現。

編輯:我應該工作,因爲維特克在評論中指出的,是隻申報類數據源<牛逼>與接口,然後重寫的createDataSource()方法。在這種方法中,你可以再做一個服務定位器調用IYourInterface執行:

var myService = ServiceLocator.Get<IYourInterface>(); 

當然,這需要您配置容器服務位置。

模式&實踐組顯然已實施服務定位器模式的Unity適配器,請參閱http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home&ProjectName=commonservicelocator

有關服務定位器模式的更多信息,請參閱http://msdn.microsoft.com/en-us/library/ff648968.aspx

+0

您可以定義DataService ,其中T是一個接口。但是,你必須重寫CreateDataSource方法並實例化上下文類(實現該接口)。不知道這是否會與注射一起工作。 –

+0

@Vitek:也許如果你重寫CreateDataSource,然後在覆蓋中使用ServiceLocator?這可能會起作用。 –

+0

儘量避免使用ServiceLocator,請儘量不要使用ServiceLocator。這是一種反模式,如本文所述http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/由Mark Seemann撰寫,他是Microsoft Patterns and Practices的ServiceLocator類的原始開發人員。他出於充分的理由馬上離開了。 –

1

此處不應使用ServiceLocator類和ServiceLocator (anti)pattern。下面的代碼看起來像是服務定位器(反)模式,但它不完全。

CreateDataSource方法是我發現組成對象圖的請求生命週期中最早的一點。這裏,它被用作組合根。 Bootstrapper是一個幫助類,它調用Unity配置,無論它是從XML還是代碼加載它。

public class PatientService : DataService<IPatientRepository> 
{ 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     // TODO: set rules to indicate which entity sets and service 
      operations are visible, updatable, etc. 
      ... 
    } 

    [WebGet] 
    public IQueryable<Patient> Patients() 
    { 
     return from p in CurrentDataSource.Patients select p; 
    } 

    protected override IPatientRepository CreateDataSource() 
    { 
     IUnityContainer container = new UnityContainer(); 
     Bootstrapper.Initialise(container); 
     return container.Resolve<IPatientRepository>(); 
    } 
} 

因此@Roy指向CreateDataSource()方法是正確的。但是應該避免使用ServiceLocator作爲類或模式。不幸的是,微軟幾乎強迫每個人都通過ServiceLocator和DependencyResolver等類來強制ServiceLocator路由。

+0

'DataService '泛型類型'T'並不是一個接口,要麼與'CreateDataSource()'方法一起工作。 –