Я хочу отделить некоторые вещи в своем коде, чтобы мне не приходилось включать библиотеки 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 должен быть неабстрактным типом с общедоступным конструктором без параметров, чтобы использовать его в качестве параметра «TInterface» в универсальном типе или методе «....RegisterService(SPSite)».
.. и, насколько я знаю, это не работает, когда я пытаюсь зарегистрировать «базовый интерфейс» напрямую (что, конечно, не имеет никакого смысла, поскольку я хочу зарегистрировать и найти конкретные интерфейсы/реализации):
ServiceLocator.RegisterService<IServiceLocatorRegisterable>(site);
У меня такое чувство, что я упускаю здесь что-то важное.