我编写了一个Unity接口IInterceptionBehavior
的实现来做一些日志记录。它依赖于ILog
来进行日志记录。
public class InterceptionLoggingBehavior : IInterceptionBehavior {
public InterceptionLoggingBehavior(ILog log) {...}
...
}
我还有一个实现ConsoleLog
的{{1}}。
我正在尝试解析使用日志记录接口拦截器的接口,但找不到ILog
。尽管我可以团结一致直接解决ILog
,但尝试直接解决InterceptionLoggingBehavior
无法正常工作:
ILog
解析UnityContainer container = ...
var l = container.Resolve<com.InsightSoftware.LoggingAPI.ILog>();
var b = container.Resolve<com.InsightSoftware.Logging.InterceptionLoggingBehavior>();
var p = container.Resolve<com.InsightSoftware.MetadataAPI.ITableIdentityProvider>();
(在第二行)工作正常,但解析了第3行的ILog
或InterceptionLoggingBehavior
(我尝试记录的界面)第4行得到错误:
当前类型com.InsightSoftware.LoggingAPI.ILog是一个接口 并且无法构建。你错过了类型映射吗?
我的问题:有谁可以告诉我为什么当ITableIdentityProvider
依赖{}时,团结无法解析ILog
?
我用来配置统一的xml,包括映射:
InterceptionLoggingBehavior
(请注意,我从未明确注册<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" />
<alias alias="ILog" type="com.InsightSoftware.LoggingAPI.ILog, com.InsightSoftware.LoggingAPI"/>
<alias alias="ConcreteLog" type="HubbleSandbox.ConsoleLog, HubbleSandbox" />
<alias alias="InterceptionLoggingBehavior" type="com.InsightSoftware.Logging.InterceptionLoggingBehavior, com.InsightSoftware.Logging" />
<!--More aliases-->
<containers>
<container>
<extension type="Interception" />
<!-- The type mapping that I expect to be resolved. -->
<register type="ILog" mapTo="ConcreteLog" />
<register type="ITableIdentityProvider" mapTo="TableIdentityProvider">
<interceptor type="InterfaceInterceptor"/>
<interceptionBehavior type="InterceptionLoggingBehavior" />
</register>
<!--More registrations-->
</container>
</containers>
,我认为通过在InterceptionLoggingBehavior
标记中使用它来隐式注册。)
我也尝试在代码中配置单位(不使用配置文件),如下所示:
interceptionBehavior
但我仍然得到同样的错误。
修改/更新 我已经做了一些挖掘并尝试更换我用
解析UnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<ILog, ConsoleLog>();
container.RegisterType<ITableIdentityProvider, TableIdentityProvider>(
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<InterceptionLoggingBehavior>());
// more registrations
var l = container.Resolve<ILog>();
var b = container.Resolve<ITableIdentityProvider>();
的行
InterceptionLoggingBehavior
我收到了错误
依赖项的解析失败,输入= \“com.InsightSoftware.Logging.InterceptionLoggingBehavior \”,name = \“(none)\”。
发生异常时:解析构造函数com.InsightSoftware.Logging.InterceptionLoggingBehavior(com.InsightSoftware.LoggingAPI.ILog log)的参数\“log \”。
异常是:InvalidCastException - 无法将类型为'HubbleSandbox.ConsoleLog'的对象强制转换为'com.InsightSoftware.LoggingAPI.ILog'。
我已经检查过类型是否可分配。
container.Resolve<InterceptionLoggingBehavior>(
new ParameterOverride(
"log",
container.Resolve<ILog>()));
和
public class ConsoleLog : ILog {...
都不会导致任何错误。我还检查了名称空间是否正确(ILog l = new ConsoleLog();
是一个常见的接口名称 - 我们使用ILog
作为ILog
中ILog
的外观 - 所以我有三重检查)。
使用
答案 0 :(得分:1)
经过多一点挖掘后,我找到了自己问题的答案,所以如果其他人发现他们遇到了完全相同的问题,我会张贴它。
我使用的设置涉及三个独立的解决方案:
ILog
的默认实现(依赖于1和2)1和2是通过NuGets
提供的我遇到的问题是我更新了API项目的程序集名称(在项目属性中)(从LoggingAPI
到com.InsightSoftware.LoggingAPI
)。然后我推送了API NuGet,然后在沙盒项目中获得了最新的NuGet - 但是我不记得在实现项目中获得最新的NuGet并重新推送它。
因此,实现正在寻找LoggingAPI
程序集中的类,但从com.InsightSoftware.LoggingAPI
程序集中获取类,因此类型不匹配且unity无法解析正确的类型