Unity 参考 XML 映射
Reference XML mappings for Unity
以下代码在版本 3.5.1404 中有效,但在版本 5.0.1 中不再有效。通过 NuGet 获取最新参考资料:
在 web.config 我有:
using Microsoft.Practices.Unity.Configuration;
using Unity;
namespace ACME.Core
{
public static class UnityCommon
{
static IUnityContainer _container;
/// <summary>
/// Returns the Common Unity Container from memory, reloads if not loaded first
/// </summary>
/// <param name="forceRefresh">Forces the container to be reloaded in memory</param>
/// <returns>IUnityContainer</returns>
public static IUnityContainer GetContainer(bool forceRefresh = false)
{
if (_container == null || forceRefresh)
{
_container = new UnityContainer();
_container.LoadConfiguration("Default"));
}
return _container;
}
}
}
这引用了 web.config 中的 XML 映射,例如:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="ACME.Core" />
<namespace name="ACME.Core.DTO" />
<container name="Default">
<register type="IStatusRepository" mapTo="StatusRepository" />
<register type="INoteRepository" mapTo="NoteRepository" />
</container>
</unity>
错误:
System.Configuration.ConfigurationErrorsException occurred
HResult=0x80131902 Message=An error occurred creating the
configuration section handler for unity: Could not load file or
assembly 'Microsoft.Practices.Unity.Configuration' or one of its
dependencies. The system cannot find the file specified.
Source=Unity.Configuration StackTrace: at
Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(IUnityContainer
container, String containerName)
at
System.Configuration.TypeUtil.GetTypeWithReflectionPermission(IInternalConfigHost
host, String typeString, Boolean throwOnError) at
System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.Init(RuntimeConfigurationRecord
configRecord, FactoryRecord factoryRecord) at
System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.InitWithRestrictedPermissions(RuntimeConfigurationRecord
configRecord, FactoryRecord factoryRecord) at
System.Configuration.RuntimeConfigurationRecord.CreateSectionFactory(FactoryRecord
factoryRecord) at
System.Configuration.BaseConfigurationRecord.FindAndEnsureFactoryRecord(String
configKey, Boolean& isRootDeclaredHere)
我需要以不同的方式调用 XML 配置吗?
顺便说一句,我只用了 _container.LoadConfiguration();并收到相同的错误。
在贡献者 Github (ENikS) 的帮助下解决了这个问题。
我使用的是旧命名空间问题:
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
但是一旦我使用了您提供的新版本,它就起作用了:
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
以下代码在版本 3.5.1404 中有效,但在版本 5.0.1 中不再有效。通过 NuGet 获取最新参考资料:
在 web.config 我有:
using Microsoft.Practices.Unity.Configuration;
using Unity;
namespace ACME.Core
{
public static class UnityCommon
{
static IUnityContainer _container;
/// <summary>
/// Returns the Common Unity Container from memory, reloads if not loaded first
/// </summary>
/// <param name="forceRefresh">Forces the container to be reloaded in memory</param>
/// <returns>IUnityContainer</returns>
public static IUnityContainer GetContainer(bool forceRefresh = false)
{
if (_container == null || forceRefresh)
{
_container = new UnityContainer();
_container.LoadConfiguration("Default"));
}
return _container;
}
}
}
这引用了 web.config 中的 XML 映射,例如:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="ACME.Core" />
<namespace name="ACME.Core.DTO" />
<container name="Default">
<register type="IStatusRepository" mapTo="StatusRepository" />
<register type="INoteRepository" mapTo="NoteRepository" />
</container>
</unity>
错误:
System.Configuration.ConfigurationErrorsException occurred HResult=0x80131902 Message=An error occurred creating the configuration section handler for unity: Could not load file or assembly 'Microsoft.Practices.Unity.Configuration' or one of its dependencies. The system cannot find the file specified. Source=Unity.Configuration StackTrace: at Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(IUnityContainer container, String containerName)
at System.Configuration.TypeUtil.GetTypeWithReflectionPermission(IInternalConfigHost host, String typeString, Boolean throwOnError) at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.Init(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord) at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.InitWithRestrictedPermissions(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord) at System.Configuration.RuntimeConfigurationRecord.CreateSectionFactory(FactoryRecord factoryRecord) at System.Configuration.BaseConfigurationRecord.FindAndEnsureFactoryRecord(String configKey, Boolean& isRootDeclaredHere)
我需要以不同的方式调用 XML 配置吗?
顺便说一句,我只用了 _container.LoadConfiguration();并收到相同的错误。
在贡献者 Github (ENikS) 的帮助下解决了这个问题。
我使用的是旧命名空间问题:
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
但是一旦我使用了您提供的新版本,它就起作用了:
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>