メインプロジェクトで使用されているDLLをサブプロジェクトにも含める必要がないように、コード内のいくつかのものを分離したいと思います。このために、サービスを登録するための次のメソッドを作成しました(MS Common Practices Service Locatorを使用します)。
public static void RegisterService<TInterface>(SPSite site) where TInterface : IServiceLocatorRegisterable, new()
{
GetServiceLocatorConfig(site).RegisterTypeMapping<IServiceLocatorRegisterable, TInterface>(typeof(TInterface).FullName);
InvalidateCache();
ご覧のとおり、特定のインターフェースにまだバインドされていないように、インターフェース「IServiceLocatorRegisterable」を作成しました。
サブプロジェクトには、サービスロケーターに登録したい特定のインターフェイスがあるので、宣言に「IServiceLocatorRegisterable」を追加しました。
public interface ISapProcess : IServiceLocatorRegisterable
{ // details omitted.. }
そして、これは私がこのインターフェースを登録しようとするコードです:
public static void RegisterSapProcess(SPSite site)
{
ServiceLocator.RegisterService<ISapProcess>(site);
}
しかし、次のコンパイラエラーが発生するため、コンパイルできません。
ISapProcessは、ジェネリック型またはメソッド'.... RegisterService(SPSite)'のパラメーター'TInterface'として使用するために、パブリックパラメーターなしのコンストラクターを持つ非抽象型である必要があります。
..そして私が知っているように、「ベースインターフェイス」を直接登録しようとしても機能しません(もちろん、特定のインターフェイス/実装を登録して見つけたいので、これは意味がありません):
ServiceLocator.RegisterService<IServiceLocatorRegisterable>(site);
ここで重要な何かが欠けているような気がします。