Кодекс наследства - PullRequest
       29

Кодекс наследства

0 голосов
/ 16 февраля 2012

Обнаружил некоторую странность с контрактами кода, и мне было интересно, знает ли кто-нибудь причину ...

хорошо, так что время для некоторых примеров кода:

Сборка 1:

[ContractClass(typeof(IServiceCodeContract<>))]
public interface IService<T> where T : class { ... }

[ContractClassFor(typeof(IService<>))]
public abstract class IServiceCodeContract<T> : IService<T> where T : class { ... }

public abstract class ServiceBase<T> : IService<T> where T : class { ... }

Сборка 2:

[ContractClass(typeof(ICampaignServiceCodeContract))]
public class CampaignService : ServiceBase<Campaign>, ICampaignService { ... }

[ContractClassFor(typeof(ICampaignService))]
public abstract class ICampaignServiceCodeContract : IServiceCodeContract<Campaign>, ICampaignService { ... }

Теперь вот моя проблема ... В этой последней строке кода компилятор работает нормально, пока я на самом деле не скомпилирую код, затем он выделит "IServiceCodeContract "с синей линией, говорящей, что он не может найти тип, который читает фактическая ошибка:

The type or namespace name 'IServiceCodeContract' could not be found (are you missing a using directive or an assembly reference?)

У меня есть ссылка из сборки 2 в сборку 1, и я импортировал оба "System.Diagnostics.Contracts"Пространство имен и пространство имен, в котором живет отсутствующий класс. Класс объявлен как открытый и отображается в рефлекторе нормально, так почему бы ему не найти его?

Есть ли какая-то проблема с наследованием контракта кода между сборками или чем-то еще?

РЕДАКТИРОВАТЬ:

Можно подумать, может ли быть проблема наследования базового класса контракта из другой сборки ... разве это не делает какой-то сумасшедший бинарный код?у инъекций вещь во время компиляции?

также размещены здесь: http://forums.asp.net/t/1770324.aspx/1

1 Ответ

1 голос
/ 16 февраля 2012

Ваш класс контракта для производного класса (ICampaignServiceCodeContract) НЕ должен происходить из чего-либо, кроме класса, который он аннотирует (в данном случае ICampaignService).

Вы можете оставить все методы, унаследованные от базовых интерфейсов / классовunimplemented (используя тело по умолчанию, сгенерированное VS) и записывать контракты только в методах, специфичных для этого класса / интерфейса.

-MaF

...