【问题标题】:Unity Injection question passing information to multiple layersUnity Injection 问题将信息传递到多个层
【发布时间】:2011-07-20 21:20:09
【问题描述】:

我正在尝试使用 Unity 对一些横切类进行依赖注入。现在我有一些缓存基础设施,我已经包裹在 MS 企业库中。我正在包装它,因为我以后可能想使用其他东西。此外,我可能想混合和匹配不同的缓存存储。

所以我有一个通用的缓存接口和一个具体的实现如下

public interface ICacheProvider
{
    void Add(object key, object value);

    void Remove(object key);

    object GetData(object key);

    void Flush();
}

public class MyCacheProvider : ICacheProvider
{
    private ICacheManager cacheManager;

    public MyProvider(ICacheManager manager)
    {
        cacheManager = manager;
    }
}

ICacheManager 属于企业库中的类型。我正在尝试做的是在运行时使用统一来解析缓存管理器。此外,对于不同的 cacheStore,这可能会有所不同。现在,它们都解析为我显示的类型。这是我的统一配置。

<unity>
<typeAliases>
  <typeAlias alias="string" type="System.String, mscorlib" />
  <typeAlias alias="ICacheProvider" type="DomainBase.Caching.ICacheProvider, DomainBase" />
  <typeAlias alias="MSCacheProvider" type="Caching.MyCacheProvider, Caching" />
</typeAliases>
<containers>
  <container>
    <types>
      <register type="ICacheProvider" mapTo="MSCacheProvider" />
    </types>
  </container>
</containers>

以下是我设置统一容器的方法:

 private IUnityContainer rootContainer;

 rootContainer = new UnityContainer().LoadConfiguration();
 var configurator = new UnityContainerConfigurator(rootContainer);
 EnterpriseLibraryContainer.ConfigureContainer(configurator, ConfigurationSourceFactory.Create());

这允许企业库自动从配置中获取信息并根据那里的内容进行解析。问题是当我深入两个级别时(即 - 我没有直接解析到企业库接口),解析失败,因为我没有命名解析。鉴于企业库扩展,不需要命名解析,因为提供的扩展注册正确的解析,就好像它被命名一样。不过,我认为 Unity 无法通过将我的界面映射到企业库来实现这一神奇的飞跃。这是一些示例代码

//note that's ICacheProvider which my interface for abstracting caching.  NOT
//the enterprise library interface
ICacheProvider customersCache = rootContainer.Resolve<ICacheProvider>(); //works
ICacheProvider productsCache = rootContainer.Resolve<ICacheProvider>("ProductsCache"); //doesn't work

第一个示例有效,因为有默认分辨率,但是第二个示例失败,因为我没有“产品”的命名分辨率。有没有好的方法来处理这种情况?我不想为我添加到系统中的每个不同的缓存存储都指定分辨率,因为它们已经在缓存配置中定义。我会尝试不同类型的注入,但在这种情况下您几乎必须使用构造函数注入。

另外,我已经尝试显式定义命名注册,即使定义了两个单独的 CacheManager 实例,我仍然会返回相同的 CacheManager 实例。我想一旦完成初始解析,它会查看构造函数并且没有留下任何“名称”,只是根据默认值注入?

感谢您的帮助

【问题讨论】:

    标签: .net dependency-injection unity-container enterprise-library


    【解决方案1】:

    找到了我自己问题的答案。我能弄清楚的唯一方法是使用自定义扩展并检查类型。这是一个示例

     public class WrappedResolver : UnityContainerExtension
    {
    
        protected override void Initialize()
        {
            this.Context.Strategies.Add(new WrappedBuilder(this.Container), Microsoft.Practices.Unity.ObjectBuilder.UnityBuildStage.PreCreation);
    
        }
    }
    
    public class WrappedBuilder : BuilderStrategy
    {
        IUnityContainer baseContainer;
    
        public WrappedBuilder(IUnityContainer container)
        {
            baseContainer = container;
        }
    
        public override void PreBuildUp(IBuilderContext context)
        {
    
            if (context.BuildKey.Type.Name.Contains("ICacheProvider") && context.OriginalBuildKey.Name != null)
            {
                string originalName = context.OriginalBuildKey.Name;
                Type mytype = Type.GetType("Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager, Microsoft.Practices.EnterpriseLibrary.Caching");
                Type originalType = context.BuildKey.Type;// Type.GetType("DomainBase.Caching.ICacheProvider, DomainBase");
                context.Existing = baseContainer.Resolve(originalType, new ParameterOverride("manager",
                                                                             new ResolvedParameter(mytype, originalName)));
    
                context.BuildComplete = true;
    
            }
            base.PreBuildUp(context);
        }   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多