首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在配置中注册一个实例

在配置中注册一个实例
EN

Stack Overflow用户
提问于 2010-07-24 09:47:17
回答 2查看 7.7K关注 0票数 5

如何在配置文件中注册实例

我有这样的代码:

代码语言:javascript
复制
UnityContainer.RegisterInstance<ICache>(new CacheMng(HttpRuntime.Cache));

并试图在配置文件中具有等效的

代码语言:javascript
复制
<register type="ICache" mapTo="CacheMng">
    <lifetime type="Singleton"/>
    <constructor>
        <param name="cache" type="System.Web.Caching" value="HttpRuntime.Cache"/>
    </constructor>>
</register>

我的CacheMng类有以下构造函数

代码语言:javascript
复制
public CacheMng(Cache cache)
{
    this._cache = cache
}

我得到了这个错误

类型名称或别名System.Web.Caching无法解析

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-24 10:34:14

您所看到的错误消息的原因是type参数需要类型名称而不是名称空间名称。System.Web.Caching是一个名称空间,而不是类型。

这样做的唯一方法是编写自定义类型转换器并使用value元素,如下所示:

代码语言:javascript
复制
<constructor>
    <param name="cache">
        <value value="" typeConverter="MyHttpRuntimeCacheConverter" />
    </param>
</constructor>

类型转换器看起来如下(以其最简单的形式):

代码语言:javascript
复制
public class MyHttpRuntimeCacheConverter : System.ComponentModel.TypeConverter
{
    public override object ConvertTo(ITypeDescriptorContext context,
                                     CultureInfo culture, object value,
                                     Type destinationType)
    {
        return HttpRuntime.Cache;
    }
}

您可以通过实际为Unity元素(例如:value元素:System.Web.HttpRuntime.Cache)提供一个值,并根据该值让类型转换器返回正确的对象,从而使其更普遍适用。

票数 3
EN

Stack Overflow用户

发布于 2012-06-12 19:58:58

基于前面的答案,我提出了创建一个TypeConverter来访问任何静态属性的想法。以下是我的实现:

TypeConverter实现

代码语言:javascript
复制
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;
        }
    }
}

使用示例:假设下面的接口和具体实现:

代码语言:javascript
复制
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; }
    }
}

我们的具体版本依赖于System.Version,因此我们配置容器来提供这个值。在我的示例中,我将为此使用配置文件。

代码语言:javascript
复制
<?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>

最后,一旦您加载了配置,您可以使用如下:

代码语言:javascript
复制
var versionManager = container.Resolve<IVersionManager>();
Console.WriteLine(versionManager.Version);

祝好运

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3324603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档