-1

私が達成しようとしているのは、(たとえば)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);
        }
    }
4

1 に答える 1