C# 在配置中向Unity注册一个实例
如何在配置文件中注册实例C# 在配置中向Unity注册一个实例,c#,.net,dependency-injection,unity-container,C#,.net,Dependency Injection,Unity Container,如何在配置文件中注册实例 <register type="ICache" mapTo="CacheMng"> <lifetime type="Singleton"/> <constructor> <param name="cache" type="System.Web.Caching" value="HttpRuntime.Cache"/> </constructor>> </regi
<register type="ICache" mapTo="CacheMng">
<lifetime type="Singleton"/>
<constructor>
<param name="cache" type="System.Web.Caching" value="HttpRuntime.Cache"/>
</constructor>>
</register>
我有以下代码:
UnityContainer.RegisterInstance<ICache>(new CacheMng(HttpRuntime.Cache));
我犯了这个错误
无法解析类型名称或别名System.Web.Caching
您看到错误消息的原因是
type
参数需要类型名称,而不是名称空间名称System.Web.Caching
是一个名称空间,而不是一种类型
唯一的方法是编写一个自定义类型转换器并使用value
元素,如下所示:
<constructor>
<param name="cache">
<value value="" typeConverter="MyHttpRuntimeCacheConverter" />
</param>
</constructor>
您可以通过实际为Unity
value
元素提供一个值(例如:System.Web.HttpRuntime.Cache
)使其更普遍适用根据这个值,让类型转换器返回正确的对象。根据前面的答案,我想到了创建一个类型转换器来访问任何静态属性的想法。以下是我的实现:
namespace EntLibUnity.UnitySample
{
public class VersionManager : IVersionManager
{
private readonly Version _version;
public string Version
{
get { return _version.ToString(); }
}
public VersionManager(Version version)
{
_version = version;
}
}
}
namespace EntLibUnity.Infrastructure
{
public interface IVersionManager
{
string Version { get; }
}
}
类型转换器实现
using System;
using System.ComponentModel;
using System.Reflection;
namespace EntLibUnity.Extensions
{
/// <summary>
/// Converts an (formatted) string to a reference of a given static member.
/// The string uses this format: {member}@{assemblyQualifiedName}
/// For example:
/// Version@System.Environment, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
/// </summary>
public class StringToStaticInstanceTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return (typeof(string) == sourceType) || base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
string stringValue;
if (value == null
|| (stringValue = value as string) == null
|| string.IsNullOrEmpty(stringValue)
|| !stringValue.Contains("@")
)
{
return null;
}
var stringParts = stringValue.Split('@');
if (stringParts.Length != 2)
{
return null;
}
var staticProperty = stringParts[0];
var assemblyQualifiedName = stringParts[1];
var staticClassType = Type.GetType(assemblyQualifiedName, true);
var staticPropertyInfo = staticClassType.GetProperty(staticProperty,
BindingFlags.Public | BindingFlags.Static |
BindingFlags.FlattenHierarchy);
var staticValue = staticPropertyInfo.GetValue(null, null) ?? base.ConvertFrom(context, culture, value);
return staticValue;
}
}
}
我们的具体版本取决于System.version,所以我们配置容器来提供这个值。在我的示例中,我将为此使用配置文件
<?xml version="1.0" encoding="utf-8" ?>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<!-- Using Design-Time Configuration: http://msdn.microsoft.com/en-us/library/ff660935(v=PandP.20).aspx#format_config -->
<!-- The Unity Configuration Schema: http://msdn.microsoft.com/en-us/library/ff660914(v=PandP.20).aspx -->
<!-- Specifying Types in the Configuration File http://msdn.microsoft.com/en-us/library/ff660933(v=PandP.20).aspx#_Default_Aliases_and-->
<alias alias="StringToStaticInstanceTypeConverter" type="EntLibUnity.Extensions.StringToStaticInstanceTypeConverter, EntLibUnity.Extensions" />
<alias alias="IVersionManager" type="EntLibUnity.Infrastructure.IVersionManager, EntLibUnity.Infrastructure" />
<alias alias="VersionManager" type="EntLibUnity.UnitySample.VersionManager, EntLibUnity.UnitySample" />
<container>
<register type="IVersionManager" mapTo="VersionManager">
<constructor>
<param name="version">
<value value="Version@System.Environment, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" typeConverter="StringToStaticInstanceTypeConverter" />
</param>
</constructor>
</register>
</container>
</unity>
最后,加载配置后,您可以按如下方式使用:
var versionManager = container.Resolve<IVersionManager>();
Console.WriteLine(versionManager.Version);
var versionManager=container.Resolve();
WriteLine(versionManager.Version);
祝你好运
<?xml version="1.0" encoding="utf-8" ?>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<!-- Using Design-Time Configuration: http://msdn.microsoft.com/en-us/library/ff660935(v=PandP.20).aspx#format_config -->
<!-- The Unity Configuration Schema: http://msdn.microsoft.com/en-us/library/ff660914(v=PandP.20).aspx -->
<!-- Specifying Types in the Configuration File http://msdn.microsoft.com/en-us/library/ff660933(v=PandP.20).aspx#_Default_Aliases_and-->
<alias alias="StringToStaticInstanceTypeConverter" type="EntLibUnity.Extensions.StringToStaticInstanceTypeConverter, EntLibUnity.Extensions" />
<alias alias="IVersionManager" type="EntLibUnity.Infrastructure.IVersionManager, EntLibUnity.Infrastructure" />
<alias alias="VersionManager" type="EntLibUnity.UnitySample.VersionManager, EntLibUnity.UnitySample" />
<container>
<register type="IVersionManager" mapTo="VersionManager">
<constructor>
<param name="version">
<value value="Version@System.Environment, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" typeConverter="StringToStaticInstanceTypeConverter" />
</param>
</constructor>
</register>
</container>
</unity>
var versionManager = container.Resolve<IVersionManager>();
Console.WriteLine(versionManager.Version);