У меня есть следующий шаблон интерфейса класса, на котором я хочу использовать MEF экспорта и экспорта:Почему следующий шаблон импорта/экспорта с интерфейсами не является законным?
public interface IDinosaur
{
string Species { get; }
}
public class Pterodactyl : IDinosaur
{
public string Species { get; set; }
public float WingSpan { get; set; }
}
public interface ICage<in T>
{
void Transport(T animal);
}
[Export(typeof(ICage<IDinosaur>))] // <-- This appears a problem
public class PterodactylCage : ICage<Pterodactyl>
{
public void Transport(Pterodactyl dinosaur) { }
}
public class DinoTransportationService
{
[Import(AllowDefault = true)]
private ICage<IDinosaur> m_dinosaurCage = null;
}
Теперь я хотел бы сказать, что это является законным, так как [Export(typeof(ICage<IDinosaur>))]
indeeds экспортирует ICage
в виде IDinosaur
(который, случается, a Pterodactyl
, но это реализует интерфейс динозавров, чтобы это было правильно?). Однако это дает мне исключение CompositionException. говоря:
"The export 'PterodactylCage (ContractName=\"ICage(IDinosaur)\")' is not assignable to type 'ICage`1[[IDinosaur, MyProgramme, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'."
Я мог бы это исправить, изменив экспорт в:
[Export(typeof(ICage<Pterodactyl>))] // <-- This is ok
public class PterodactylCage : ICage<Pterodactyl>
И импорт в:
[Import(AllowDefault = true)]
private ICage<Pterodactyl> m_dinosaurCage = null;
Кроме этого, что импорт теперь становится слишком конкретным, и в факт, в моем случае импорт находится в другой сборке, которая никогда не слышала о Pterodactyls, так что это плохое решение. Почему первый пример не является законным, и каково решение для этого шаблона?
Спасибо, это объяснение действительно является хорошим объяснением того, почему вышеуказанное не является законным. Есть ли альтернатива, которая делает то, что я хочу сделать возможным? – Yellow
Well ICage НЕ МОЛОДЕЖЬ в вашем случае. Если вы каким-то образом сможете добиться успеха в своем экспорте, а кто-то передал Theropods в ваш метод транспорта - он будет терпеть неудачу во время выполнения. Поэтому вы должны пересмотреть свою логику, потому что то, что вы пытаетесь сделать, просто неверно. –
Evk
Но вы можете использовать ICage вместо ICage и экспортировать его. Вы можете проверить внутри метода транспорта, какой объект был передан как IDinosaur здесь (потому что это может быть любой динозавр снова). –
Evk