Вопрос WCF. У меня проблемы с несколькими сборками, наследованиями и контрактами данных.
Senario: двоичные файлы контрактов на данные являются общими
Common.dll
[DataContract]
public abstract class Command
{
[DataMember]
public Guid Id { get; set; }
public Command(Guid id)
{
Id = id;
}
}
assembly1.dll
[DataContract]
public class DeleteStuff : Command
{
public DeleteStuff(Guid id)
: base(id) { }
[DataMember]
public int StuffToDeleteID { get; set; }
}
assembly2.dll
[DataContract]
public class DeleteSomeOtherStuff : Command
{
public DeleteSomeOtherStuff(Guid id)
: base(id) { }
[DataMember]
public int SomeOtherID { get; set; }
}
Договор на обслуживание
[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(DerivedType))]
public partial interface ICommandsServiceContract
{
[OperationContract]
void Execute(IEnumerable<Command> command);
}
класс DerivedType, метод GetKnownTypes
public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
{
//Works!*!*! but hard-coded, wont work in big picture since i dont know all the classes
//return new List<Type> { typeof(DeleteSomeOtherStuff), typeof(DeleteStuff) };
//DOESNT WORK!!
Type type = typeof(Command);
IEnumerable<Type> types = AppDomain.CurrentDomain.GetAssemblies().ToList()
.SelectMany(a => a.GetTypes()
.Where(t => type.IsAssignableFrom(t)));
IEnumerable<Type> j = types.ToArray();
return j;
}
Если я поставлю точку останова на возврат j; выше, когда служба запускается впервые, она имеет правильные типы сборок, которые наследуются от Command. Затем клиент раскручивается, и как только я отправляю DeleteSomeOtherStuff в службу, он взрывается с ошибкой в предложении SelectMany.
Server Error in '/' Application.
Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
Source Error:
Line 25: var type = typeof(Command);
Line 26: var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
Line 27: .SelectMany(a => a.GetTypes())
Line 28: .Where(t => type.IsAssignableFrom(t));
Line 29:
Строка 27 помечена как ошибка.
Я попытался бросить список массивов в статическую переменную, чтобы кэшировать его при первом запуске службы, а затем он был бы доступен при вызове потребителем, но с такой же ошибкой.
Я использую базовую фабрику каналов от клиента.
Идеи ?? Я не могу ограничиться одной сборкой.
Спасибо !!