单元:在运行时使用对象类型解析通用服务

本文关键字:服务 类型 对象 运行时 单元 | 更新日期: 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