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

时间:2013-09-26 21:06:17

标签: c# generics unity-container

我想要完成的是拥有一个具有(例如)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);
        }
    }

1 个答案:

答案 0 :(得分:0)

这似乎更像是https://codereview.stackexchange.com/的一个问题(我不是那个给你投票的人,顺便说一句)。

尽管如此,如果你真的没有可以为所有ICommand调用的服务,那么你不应该在合同中提供。解决此问题的一种简单方法是将ICommand界面扩展为类似IServiceCommand的内容,并使ICommand支持实施IServiceCommand,并将您的服务合同绑定到那个界面。这允许您在具有ICommand的任何方法中使用您的具体类,但您的服务仍然只为那些ICommand的{​​{1}}提供服务。