我使用Spring.Net构建了一个应用程序。我遇到了一个需要重命名可执行文件的场景。我认为最简单的方法是重命名.exe及其.config文件,但这会在TypeLoadException
期间导致ContextRegistry.GetContext()
。
以下是结构:
-Release
|-Library.dll
|-MyApp.exe
|-MyApp.exe.Config
|-SpringConfigFile.xml
在SpringConfigFile中我有:
<object id="ObjFromLibrary" type="Library.SomeType, Library">
<!-- properties go here -->
</object>
<object id="ObjFromMyApp" type="MyApp.SomeOtherType, MyApp">
<!-- properties -->
</object>
(当然,这是简化的,我有许多类型派生自MyApp
程序集的对象)
例外情况如下:
Error creating context 'spring.root': Could not load type from string value 'MyApp.SomeOtherType, MyApp'. ---> Spring.Core.CannotLoadObjectTypeException: Cannot resolve type [MyApp.SomeOtherType, MyApp] for object with name 'ObjFromMyApp' defined in file Release\SpringConfigFile.xml] line 5 ---> System.TypeLoadException: Could not load type from string value 'MyApp.SomeOtherType, MyApp'.
这基本上表明Spring在创建对象ObjectFromLibrary
时没有问题,但在ObjFromMyApp
上失败(在我的“真实世界”应用程序中,ObjFromMyApp
是第一个依赖于{MyApp
的对象。 1}}而不是另一个dll)
我的问题是,有没有办法轻松重命名此.exe并且没有Spring无法加载?我知道我可以使用新名称重建项目并重构SpringConfigFile.xml
以使用新程序集,但我更愿意在没有重建的情况下执行此操作。如果这需要重构项目一次,以便我以后可以重命名,那也是可以接受的。
另一个更哲学的问题是,我是否应该重命名.exe文件以使.NET程序停止工作?
答案 0 :(得分:1)
我知道我可以用新名称重建项目并重构 SpringConfigFile.xml使用新的程序集,但我更喜欢这样做 没有重建。
您不需要重建项目。只修改SpringConfigFile.xml的内容,使其使用程序集的新名称。
另一个更哲学的问题是,我应该期待重命名吗? .exe文件导致.NET程序停止工作?
这完全取决于该程序的设计方式和工作方式。正如您在已经发现的情况下发现的那样,Spring.NET使用运行时绑定到实际类型,如果声明了此类型的程序集被修改,它将破坏配置。
所以基本上你需要同时执行xml配置文件的更新和可执行文件的重命名。
我不确定Spring.NET是否支持流畅的API来配置您的容器,但其他一些DI框架(例如Ninject)肯定会对此类重命名更加稳定,因为容器设置是使用代码而不是某些弱类型的魔术字符串个XML。