Unity 扩展依赖注入容器

约翰尼 5

我正在开发一个项目,该项目目前在整个代码中使用服务定位器反模式。我正在开始慢慢地将所有内容转换为使用依赖注入的过程,但是由于项目的庞大规模,我想在一段时间内这样做。

我有一个自定义工厂,其中有 100 个使用自定义实现注册的依赖项。所以我想用 unity 包装我的容器,如果我当前的容器没有实现,那么回退到使用 unitys。

我写了这个类来包装 IUnityContainer

public class GlobalFactoryUnityWrapper : IUnityContainer
{
    IUnityContainer _unityContainer = new UnityContainer();
    IUnityContainer _parent;

    public GlobalFactoryUnityWrapper(IUnityContainer parent = null)
    {
        this._parent = parent ?? this._unityContainer.Parent;
    }

    public IUnityContainer Parent => this._parent;

    //... Other IUnityContainer members

    public object Resolve(Type type, string name, params ResolverOverride[] resolverOverrides)
    {
        if(GlobalContext.InstanceFactory.CanGetInstance(type))
        {
            return GlobalContext.InstanceFactory.GetInstance(type);
        }

        return this._unityContainer.Resolve(type, name, resolverOverrides);
    }
}

我在那里为我的控制器注册了大部分依赖项,但是控制器本身不是,所以它回退到使用统一的容器。

编辑我认为我使用了错误的东西,我应该使用一种策略。我的主要目标是如果容器不包含实现,回退使用旧容器中注册的内容

约翰尼 5

我需要创建一个回退策略,这可能不是最佳代码,但现在可以使用

public class FactoryFallbackExtension : UnityContainerExtension
{
    public FactoryFallbackExtension()
    {
    }

    protected override void Initialize()
    {
        var strategy = new FallBackStrategy(Context);
        Context.Strategies.Add(strategy, UnityBuildStage.PreCreation);
    }
}
public class FallBackStrategy : BuilderStrategy
{
    private ExtensionContext baseContext;

    public FallBackStrategy(ExtensionContext baseContext)
    {
        this.baseContext = baseContext;
    }

    public override void PreBuildUp(IBuilderContext context)
    {
        var key = context.OriginalBuildKey;
        if (key.Type.IsInterface)
        {
            if(GlobalContext.InstanceFactory.CanGetInstance(key.Type))
                context.Existing = GlobalContext.InstanceFactory.GetInstance(key.Type);    
        }
    }
}

然后当我配置我的容器时,我可以像这样添加容器扩展:

public static void Configure()
{
    var container = new UnityContainer();
    RegisterDepedencies(container);
    container.AddExtension(new FactoryFallbackExtension());
    GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    SetControllerFactory(container);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Unity vs自定义依赖注入?

来自分类Dev

Unity vs自定义依赖注入?

来自分类Dev

为什么要在ASP.Net应用程序中使用IoC容器(Autofac,Ninject,Unity等)进行依赖项注入?

来自分类Dev

在Unity依赖注入c#中注入通用接口的IEnumerable

来自分类Dev

什么是依赖注入容器?

来自分类Dev

依赖注入容器PHP

来自分类Dev

C#Unity容器构造函数注入列表<childs>

来自分类Dev

C#Unity容器构造函数注入列表<childs>

来自分类Dev

如何将Unity映射为注入容器实例?

来自分类Dev

如何使用Unity通过工厂注入依赖项?

来自分类Dev

身份提供者和Unity依赖注入

来自分类Dev

MVC Web API和Unity用于依赖性注入

来自分类Dev

带有分层视图模型的Unity的MVVM依赖项注入

来自分类Dev

Unity对WPF MVVM应用程序的依赖注入

来自分类Dev

带有WebAPI的Microsoft Unity依赖项注入

来自分类Dev

Unity依赖注入解决返回System.NullReferenceException

来自分类Dev

实施Unity依赖注入后对AJAX进行长轮询

来自分类Dev

在ASP.NET中使用Unity进行依赖项注入

来自分类Dev

扩展类的依赖注入?

来自分类Dev

依赖注入-注入容器还是个人依赖?

来自分类Dev

依赖的解析 - Xamarin - Unity

来自分类Dev

Ioc容器:依赖注入,依赖查找?

来自分类Dev

如何实现依赖注入容器和依赖注入

来自分类Dev

如何实现依赖注入容器和依赖注入

来自分类Dev

Unity中具有优先级/后备和泛型的依赖项注入

来自分类Dev

具有全局Web API过滤器属性的Unity依赖项注入

来自分类Dev

难以将Unity依赖项注入与WebAPI和OWIN一起使用

来自分类Dev

使用Unity.Mvc5注入依赖项时的多个控制器构造函数

来自分类Dev

Unity IoC不会将依赖项注入Web API控制器

Related 相关文章

热门标签

归档