Dependency injection Castle Windsor找不到系统。正在发送消息
我意识到这个问题非常类似于,但不幸的是,它并不能完全解决我的问题 我有一个控制台应用程序,在我的castle配置部分中包含以下内容:Dependency injection Castle Windsor找不到系统。正在发送消息,dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,我意识到这个问题非常类似于,但不幸的是,它并不能完全解决我的问题 我有一个控制台应用程序,在我的castle配置部分中包含以下内容: <component id="LegacyMessageFormatter" service="System.Messaging.IMessageFormatter, System.Messaging" type="MsmqLogProcessor.Core.Services.LegacyMessageForm
<component id="LegacyMessageFormatter"
service="System.Messaging.IMessageFormatter, System.Messaging"
type="MsmqLogProcessor.Core.Services.LegacyMessageFormatter, MsmqLogProcessor.Core"/>
我已在System.Messaging中将Copy Local设置为true。当我按F5时,它就起作用了。
然而,当我发布我的控制台应用程序并在生产设备上运行它时,我会遇到同样的问题。安装后,我无法在ApplicationFiles文件夹中看到System.Messaging dll,可能是因为它认为它在GAC中
我尝试过将dll复制到这个文件夹中,但仍然没有乐趣
你知道我错过了什么吗?将系统程序集指定为服务是一个好主意吗 Windsor不查找系统部件中的类型,如您在此处所见 它显式跳过名称以System开头的程序集中定义的类型 不知道为什么,但您可以使用自己的ConversionManager来解决这个问题
public class MyConversionManager : DefaultConversionManager
{
protected override void InitDefaultConverters()
{
Add(new SystemMessaging_TypeConverter(new TypeNameParser()));
base.InitDefaultConverters();
}
}
public class SystemMessaging_TypeConverter : TypeNameConverter
{
public SystemMessaging_TypeConverter(ITypeNameParser parser) : base(parser)
{
}
protected override bool ShouldSkipAssembly(System.Reflection.Assembly assembly)
{
return !assembly.FullName.StartsWith("System.Messaging") && base.ShouldSkipAssembly(assembly);
}
}
并将其安装在容器中,如下所示:
var container = new WindsorContainer();
container.Kernel.AddSubSystem(SubSystemConstants.ConversionManagerKey, new MyConversionManager());
container.Install(Configuration.FromAppConfig());
然后注册服务,但不注册程序集名称:
<component id="LegacyMessageFormatter"
service="System.Messaging.IMessageFormatter"
type="MsmqLogProcessor.Core.Services.LegacyMessageFormatter, MsmqLogProcessor.Core">
尝试使用完全限定的类型名称:
<component id='LegacyMessageFormatter'
service='System.Messaging.IMessageFormatter, System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
type='...'/>
非常好。谢谢你。我有一种感觉,这与Castle忽略系统类型有关,但我对Castle的胆识了解不够,无法理解。现在试试这个…呜呜。成功了!比使用自己的ConversionManager更优雅。干杯,伙计。顺便问一下,使用完全限定类型名的意义是什么?为什么这会有不同?
<component id='LegacyMessageFormatter'
service='System.Messaging.IMessageFormatter, System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
type='...'/>