单元:在运行时使用对象类型解析通用服务
本文关键字:服务 类型 对象 运行时 单元 | 更新日期: 2023-09-27 18:33:07
我要完成的是拥有一个具有(例如(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);
}
}
如果你真的没有一个可以调用所有ICommand
的服务,那么你不应该在其合同中提供它。解决此问题的一种简单方法是将ICommand
接口扩展到类似 IServiceCommand
的接口,并让那些受支持的ICommand
实现IServiceCommand
,并将您的服务协定绑定到该接口。这允许你的具体类在任何需要ICommand
的方法中使用,但你的服务仍然只服务于那些同样IServiceCommand
ICommand
。