使用Unity在config中注册实例

use*_*411 5 .net c# dependency-injection unity-container

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

我有这个代码:

UnityContainer.RegisterInstance<ICache>(new CacheMng(HttpRuntime.Cache));
Run Code Online (Sandbox Code Playgroud)

并尝试在配置文件中具有等效项

<register type="ICache" mapTo="CacheMng">
    <lifetime type="Singleton"/>
    <constructor>
        <param name="cache" type="System.Web.Caching" value="HttpRuntime.Cache"/>
    </constructor>>
</register>
Run Code Online (Sandbox Code Playgroud)

我的CacheMng类有这个构造函数

public CacheMng(Cache cache)
{
    this._cache = cache
}
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误

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

Ron*_*erg 3

您收到错误消息的原因是该type参数需要类型名称而不是命名空间名称。System.Web.Caching是命名空间而不是类型。

执行此操作的唯一方法是编写自定义类型转换器并使用该value元素,如下所示:

<constructor>
    <param name="cache">
        <value value="" typeConverter="MyHttpRuntimeCacheConverter" />
    </param>
</constructor>
Run Code Online (Sandbox Code Playgroud)

类型转换器看起来像这样(最简单的形式):

public class MyHttpRuntimeCacheConverter : System.ComponentModel.TypeConverter
{
    public override object ConvertTo(ITypeDescriptorContext context,
                                     CultureInfo culture, object value,
                                     Type destinationType)
    {
        return HttpRuntime.Cache;
    }
}
Run Code Online (Sandbox Code Playgroud)

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