【问题标题】:Unity Extending Dependency Injection ContainersUnity 扩展依赖注入容器
【发布时间】:2018-12-18 19:44:52
【问题描述】:

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

我有一个自定义工厂,其中包含 100 个通过自定义实现注册的依赖项。所以我想用统一包装我的容器,如果我当前的容器没有实现然后回退到使用统一。

我写了这个类来包装 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);
    }
}

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

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

【问题讨论】:

  • 最后一句话让我很困惑?递归检查?
  • @Nkosi 抱歉,我已经编辑了这个问题,我以前从未使用过统一,我想我正在寻找一个自定义构建器策略,也许吧?如果统一容器没有实例,我只想退回使用另一个容器。

标签: c# dependency-injection inversion-of-control unity-container


【解决方案1】:

我需要创建一个后备策略,这可能不是最优化的代码,但它现在可以工作

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);
}

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 2022-10-15
    • 2013-04-30
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多