使用AutoFac解析通用集合

时间:2014-03-28 03:40:07

标签: c# generics autofac

我找不到一个关于将集合解析为基类的问题。我有以下伪测试类,它使用AutoFac来解析处理程序:

namespace Test {

    interface IEventEmitter {}

    interface IEventHandler {}

    interface IEventHandler<in T> : IEventHandler where T: IEventEmitter {}

    interface ISomeClass : IEventEmitter {}

    class SomeClass : ISomeClass
    {
        // 2 handlers should be resolved here, not one!
        public SomeClass(IEnumerable<IEventHandler> handlers) {}
    }

    class GenericEventHandler : IEventHandler {}

    class DedicatedEventHandler : IEventHandler<ISomeClass> {}

    [TestClass]
    class TestClass
    {
        [TestMethod]
        private void TestHandlers()
        {
            var builder = new ContainerBuilder();

            // registered in order to resolve handlers
            builder.RegisterType<SomeClass>().As<ISomeClass>();

            builder.RegisterType<GenericEventHandler>().As<IEventHandler>();

            builder.RegisterType<DedicatedEventHandler>().As<IEventHandler<ISomeClass>>();

            var container = builder.Build();

            using (var scope = container.BeginLifetimeScope())
            {
                var instanceWithHandlers = scope.Resolve<ISomeClass>();
            }
        }
    }
}

请注意,我正在为ISomeClass接口注册一个专用处理程序,以及一个泛型 一个用于任何类型的事件发射器。我的期望是SomeClass构造函数将注入2个处理程序 - 通用和专用处理程序。

不幸的是,事实并非如此。我在这里做错了什么?

感谢。

1 个答案:

答案 0 :(得分:3)

使用As注册接口时,Autofac不会自动注册其基接口。

因此,您需要手动告知Autofac您的DedicatedEventHandler也是IEventHandler,并且:

builder.RegisterType<DedicatedEventHandler>()
       .As<IEventHandler<ISomeClass>>()
       .As<IEventHandler>();

如果要注册包含其所有接口的类型,可以使用AsImplementedInterfaces方法。

所以相应的上述注册如下:

builder.RegisterType<DedicatedEventHandler>()
       .AsImplementedInterfaces();