2012-12-13 60 views
0

我想解耦我的代碼中的一些東西,這樣我就不必在子項目中也包含主項目中使用的DLL。爲此,我創建了以下方法來註冊服務(使用MS慣例的服務定位器):調用泛型方法給出編譯器錯誤

public static void RegisterService<TInterface>(SPSite site) where TInterface : IServiceLocatorRegisterable, new() 
     { 
      GetServiceLocatorConfig(site).RegisterTypeMapping<IServiceLocatorRegisterable, TInterface>(typeof(TInterface).FullName); 
      InvalidateCache(); 

所以,你看到我創建的接口「IServiceLocatorRegisterable」所以,我不是綁定到一個具體interace呢。

在次項目中,我有一個特定的接口我想與服務定位器註冊,所以我增加了「IServiceLocatorRegisterable」的聲明:

public interface ISapProcess : IServiceLocatorRegisterable 
{ // details omitted.. } 

而這正是我嘗試註冊代碼這個接口:

public static void RegisterSapProcess(SPSite site) 
{ 
    ServiceLocator.RegisterService<ISapProcess>(site); 
} 

但我不能編譯它,因爲我得到follwing編譯器錯誤:

ISapProcess must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TInterface' in the generic type or method '....RegisterService(SPSite)'

..正如我所知,當我嘗試直接註冊「基本接口」(當然這沒有任何意義,因爲我想註冊並找到特定的接口/實現),它看起來並沒有工作:

ServiceLocator.RegisterService<IServiceLocatorRegisterable>(site); 

我有這種感覺,我在這裏失去了一些重要的東西。

+0

這是微軟的SharePoint類:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint。 spsite.aspx – Patric

回答

2

嗯,是 - 看看你的約束:

where TInterface : IServiceLocatorRegisterable, new() 

你不能寫:

ISapProcess x = new ISapProcess(); 

可以嗎?這就是約束所要求的。

要麼需要溝渠約束,或更改您的類型參數。 (根據你提供的代碼,你不知道你要做什麼。)

+0

啊,我明白了。我現在明白你的意思,讓我修改我的代碼。保持更新。 – Patric