Autofac и открытые дженерики - PullRequest
0 голосов
/ 06 июля 2011

Возможно ли заставить этот сценарий работать?

[TestFixture]
    public class AutofacTests
    {
        private IContainer _container;

        public AutofacTests()
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<Command1>();
            builder.RegisterType<Command2>();

            builder.RegisterType<CommandHandler1>();
            builder.RegisterType<CommandHandler2>();

            builder.RegisterGeneric(typeof (IHandle<>));

            _container = builder.Build();
        }

        [Test]
        [Ignore]
        public void Open_generics_test()
        {
            //this isn't working
            CommandHandler1 commandHadler1 = _container.Resolve<IHandle<Command1>>();
            CommandHandler2 commandHadler2 = _container.Resolve<IHandle<Command2>>();
        }

        interface IHandle<T> where T : class
        {
            void Handle(T command);
        }

        class CommandHandler1 : IHandle<Command1>
        {
            public void Handle(Command1 command)
            {
                throw new System.NotImplementedException();
            }
        }

        class Command1{}

        class CommandHandler2 : IHandle<Command2>
        {
            public void Handle(Command2 command)
            {
                throw new System.NotImplementedException();
            }
        }

        class Command2{}
    }

1 Ответ

2 голосов
/ 07 июля 2011

Я почти уверен, что RegisterGeneric требуется конкретный тип реализации для закрытия (например, Handler<T>. Я не думаю, что вы можете использовать такой интерфейс, как у вас.

Вы можете достичь желаемого с помощью следующего альтернативного регистрационного кода.

var builder = new ContainerBuilder();

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .AsClosedTypesOf(typeof(IHandle<>));

_container = builder.Build();

var commandHandler1 = _container.Resolve<IHandle<Command1>>();
var commandHandler2 = _container.Resolve<IHandle<Command2>>();

Я добавил рабочую версию этого в AutofacAnswers на GitHub.

...