0

メインプロジェクトで使用されている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);

ここで重要な何かが欠けているような気がします。

4

1 に答える 1

2

はい、制約を見てください。

where TInterface : IServiceLocatorRegisterable, new()

あなたは書くことができません:

ISapProcess x = new ISapProcess();

あなたはできる?それが制約に必要なことです。

制約を破棄する、型引数を変更する必要があります。(提供したコードを考えると、何をしようとしているのかは明確ではありません。)

于 2012-12-13T10:19:49.510 に答える