摘要:似乎没有针对类型映射运行InjectionFactory。我想知道为什么以及如何解决问题。

一开始,我尝试注册界面

Container.RegisterType<ILogger>(new InjectionFactory((c, t, n) => {
                return LogManager.GetLogger(n);
            }));


并使用服务定位器解决

ServiceLocator.GetInstance<ILogger>("Operation Manager");


这导致

The current type, NLog.ILogger, is an interface and cannot be constructed. Are you missing a type mapping?


经过一番修补,我决定尝试其他方法,并使用具体类型注册了服务

Container.RegisterType<Logger>(new InjectionFactory((c, t, n) => {
                    return LogManager.GetLogger(n);
                }));


并将分辨率方法更改为

public OperationService([Dependency("Operation Service")]Logger logger)


这将导致以下错误:

 The type Logger does not have an accessible constructor.


我能想到的唯一原因是,实际上没有调用我通过InjectionFactory传递的函数来解析该对象。

最佳答案

这是因为您注册了没有名称的类型,并且试图通过名称解析它。 Unity寻找(ILogger, "Operation Manager")的注册,但找不到任何注册。没有名称的注册不会被视为合格的候选人,因此不会调用InjectionFactory

据我所知,没有内置的方法可以实现您想要的目标。使用自定义扩展名可能会实现,但是到目前为止,我的尝试均未成功。

10-07 19:02