Я внедряю службу WCF и хочу реализовать ее таким образом, чтобы клиенты могли выполнять команды на сервере, даже если реализация команды отсутствует на сервере.
Код должен выглядеть примерно так:
//Common interface - used by both client and server
public interface ICommand
{
//add whatever method/property is needed to achieve the goal
}
//Server side interface and implementation
[ServiceContract()]
public interface ICommandChannel
{
[OperationContract]
object ExecuteCommand(ICommand command, Guid clientId);
}
public class CommandExecutor : ICommandChannel
{
object ExecuteCommand(ICommand command, Guid clientId)
{
//this should be able to execute any command clients send
}
}
//Client side commands implementation
public class FileUploadCommand : ICommand
{
}
public class AuthorizeUSerCommand : ICommand
{
}
public class SubmitChangesCommand : ICommand
{
}
//etc
Если бы было разрешено сериализовать методы, то решение было бы очень простым, поскольку мы могли бы сериализовать метод Execute
(и другие методы), определенные в ICommand
, отправить его через канал и десериализовать его сервер и вызовите метод Execute
. Но это невозможно, потому что сериализация метода не разрешена (насколько я знаю).
Итак, мой вопрос, есть ли решение этой проблемы? Может ли здесь помочь дерево выражений?
EDIT:
Я не могу сообщить серверу о реализации. Потому что, если я это сделаю, то мне придется создавать и развертывать сервис каждый раз, когда я добавляю новые команды на стороне клиента. Или я что-то упустил?