更改依赖链中的最低级别
本文关键字:依赖 | 更新日期: 2023-09-27 18:14:50
在我的项目中,我有5个类:
- ClassA(实现接口IClassA),接受IClassC作为构造函数的参数
- ClassB(实现接口IClassB),接受IClassC作为构造函数的参数
- ClassC(实现接口IClassC),接受IClassD作为构造函数的参数
- ClassD1和ClassD2(均实现接口IClassD)
我的Unity容器的配置如下:
container.RegisterType<IClassA, ClassA>(new HierarchicalLifetimeManager());
container.RegisterType<IClassB, ClassB>(new HierarchicalLifetimeManager());
container.RegisterType<IClassC, ClassC>(new HierarchicalLifetimeManager());
container.RegisterType<IClassD, ClassD1>(nameof(ClassD1), new HierarchicalLifetimeManager());
container.RegisterType<IClassD, ClassD2>(nameof(ClassD2), new HierarchicalLifetimeManager());
我想配置我的项目,即:
- iclass 正在使用ClassC,而ClassC正在使用ClassD1
- IClassB正在使用ClassC,后者正在使用ClassD2
我猜我应该在注册IClassA和IClassB时改变一些东西。我想避免更改 iclass 注册。
这可能吗?
我不知道你想这样做的确切原因,但在工厂的帮助下这是可能的。
虽然它可以工作,但我可能会检查设计和环境,因为它很复杂,它会让开发人员感到困惑(它有味道)。
class Program
{
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IClassC, ClassC>();
container.RegisterType<IClassD, ClassD1>(nameof(ClassD1), new HierarchicalLifetimeManager());
container.RegisterType<IClassD, ClassD2>(nameof(ClassD2), new HierarchicalLifetimeManager());
container.RegisterType<IClassA, ClassA>(new InjectionConstructor(Factory.GetClassC<ClassD1>(container)));
container.RegisterType<IClassB, ClassB>(new InjectionConstructor(Factory.GetClassC<ClassD2>(container)));
var classA = container.Resolve<IClassA>();
var classB = container.Resolve<IClassB>();
classA.HelloFromA();
classB.HelloFromB();
}
}
public class Factory
{
public static IClassC GetClassC<TClassD>(IUnityContainer container)
where TClassD : IClassD
{
return container.Resolve<IClassC>(new DependencyOverride<IClassD>(
container.Resolve<IClassD>(typeof(TClassD).Name)));
}
}
public interface IClassA
{
void HelloFromA();
}
public interface IClassB
{
void HelloFromB();
}
public interface IClassC
{
void HelloFromC();
}
public interface IClassD { }
public class ClassA : IClassA
{
private readonly IClassC _classC;
public ClassA(IClassC classC)
{
_classC = classC;
}
public void HelloFromA()
{
_classC.HelloFromC();
}
}
public class ClassB : IClassB
{
private readonly IClassC _classC;
public ClassB(IClassC classC)
{
_classC = classC;
}
public void HelloFromB()
{
_classC.HelloFromC();
}
}
public class ClassC : IClassC
{
private readonly IClassD _classD;
public ClassC(IClassD classD)
{
_classD = classD;
}
public void HelloFromC()
{
Console.WriteLine(string.Format("Hello with {0}", _classD.GetType().Name));
}
}
public class ClassD1 : IClassD
{
}
public class ClassD2 : IClassD
{
}
注意事项:
- 注意注册顺序。a类和b类在最后注册,
- HierarchicalLifetimeManager不能在这个实例中使用,因为你需要同一个类的两个不同实例。
考虑阅读这篇文章:http://sharpfellows.com/post/Unity-IoC-Container-