我想要完成的是拥有一个具有(例如)Insert(ICommand命令)方法的wcf服务,并且可以解析知道如何插入底层对象类型的通用服务。
我在沙盒项目上的(差)尝试的地方。 除了其他缺陷,此服务允许尝试插入任何ICommand。 我是相对新的单位用户,我想知道是否有人有更好的方法来实现这一目标。
class Program
{
static void Main(string[] args)
{
var cmd = new SingleCommand();
var cmd2 = new DoubleCommand();
var s = new MyWcfService();
s.Insert(cmd);
s.Insert(cmd2);
Console.ReadKey();
}
}
public interface ICommand { }
public interface ICommandService
{
void Insert(ICommand command);
}
public interface ICommandService<in T> : ICommandService where T : ICommand
{
void Insert(T command);
}
public class SingleCommand : ICommand { }
public class DoubleCommand : ICommand { }
public class SingleCommandService : ICommandService<SingleCommand>
{
public void Insert(SingleCommand singleCommand)
{
Console.WriteLine("Inserted a SingleCommand");
}
void ICommandService.Insert(ICommand command)
{
Insert((SingleCommand)command);
}
}
public class DoubleCommandService : ICommandService<DoubleCommand>
{
public void Insert(DoubleCommand doubleCommand)
{
Console.WriteLine("Inserted a DoubleCommand");
}
void ICommandService.Insert(ICommand command)
{
Insert((DoubleCommand)command);
}
}
public static class Config
{
public static UnityContainer Container = new UnityContainer();
static Config()
{
Container.RegisterType<ICommandService, SingleCommandService>(typeof(SingleCommand).Name);
Container.RegisterType<ICommandService, DoubleCommandService>(typeof(DoubleCommand).Name);
}
}
public class MyWcfService
{
public void Insert(ICommand command)
{
var foo = Config.Container.Resolve<ICommandService>(command.GetType().Name);
foo.Insert(command);
}
}
答案 0 :(得分:0)
这似乎更像是https://codereview.stackexchange.com/的一个问题(我不是那个给你投票的人,顺便说一句)。
尽管如此,如果你真的没有可以为所有ICommand
调用的服务,那么你不应该在合同中提供。解决此问题的一种简单方法是将ICommand
界面扩展为类似IServiceCommand
的内容,并使ICommand
支持实施IServiceCommand
,并将您的服务合同绑定到那个界面。这允许您在具有ICommand
的任何方法中使用您的具体类,但您的服务仍然只为那些ICommand
的{{1}}提供服务。