簡體   English   中英

使用AutoFac解析通用集合

[英]Resolving Generic Collections using 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個處理程序 - 通用和專用處理程序。

不幸的是,事實並非如此。 我在這做錯了什么?

謝謝。

使用As Autofac注冊接口時,不會自動注冊其基本接口。

所以你需要手動告訴Autofac你的DedicatedEventHandler也是一個IEventHandler

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

如果要注冊具有其所有接口的類型,可以使用AsImplementedInterfaces方法。

所以相應的上述注冊如下:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM