Unity 扩展依赖注入容器
Unity Extending Dependency Injection Containers
我正在开发一个项目,该项目当前在整个代码中使用服务定位器反模式。我正在开始慢慢地将所有内容转换为使用依赖项注入的过程,但是由于项目的庞大规模,我想在一段时间内完成这项工作。
我有一个自定义工厂,其中有 100 个注册了自定义实现的依赖项。所以我想用 unity 包装我的容器,如果我当前的容器没有实现然后回退使用 unitys。
我写这个 class 来包装 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);
}
}
我在那里为我的控制器注册了大部分依赖项,但是控制器本身没有,所以它回退到使用 unity 的容器。
编辑
我想我用错了东西,我应该使用策略。我的主要目标是如果容器不包含实现,回退到使用旧容器中注册的内容
我需要创建一个回退策略,这可能不是最佳代码,但它现在可以工作
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);
}
我正在开发一个项目,该项目当前在整个代码中使用服务定位器反模式。我正在开始慢慢地将所有内容转换为使用依赖项注入的过程,但是由于项目的庞大规模,我想在一段时间内完成这项工作。
我有一个自定义工厂,其中有 100 个注册了自定义实现的依赖项。所以我想用 unity 包装我的容器,如果我当前的容器没有实现然后回退使用 unitys。
我写这个 class 来包装 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);
}
}
我在那里为我的控制器注册了大部分依赖项,但是控制器本身没有,所以它回退到使用 unity 的容器。
编辑 我想我用错了东西,我应该使用策略。我的主要目标是如果容器不包含实现,回退到使用旧容器中注册的内容
我需要创建一个回退策略,这可能不是最佳代码,但它现在可以工作
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);
}