自定义解析嵌套依赖
Custom resolve nested dependencies
假设以下 class 结构:
ClassA (IClassB classb, IClassC classc) : IClassA
ClassB (IClassC classc) : IClassB
ClassC1 () : IClassC
ClassC2 () : IClassC
假设我想在 ClassC1
用于具体解析 IClassA
时使用它,即 container.GetInstance<IClassA>()
会 return
new ClassA(
new ClassB (new ClassC1()),
new ClassC1()
)
我可以在 StructureMap 中做这样的事情吗? (理想情况下,类似于 For<ClassA>().Nest(x => x.For<IClassC>().Use<ClassC1>())
,但任何东西都可以。)
这是我得到的:
public interface IClassA
{
}
public interface IClassB
{
}
public interface IClassC
{
}
public class ClassA: IClassA
{
public ClassA(IClassB classb, IClassC classc)
{
Console.WriteLine("ClassA");
Console.WriteLine(" ClassB: {0}", classb.GetType());
Console.WriteLine(" ClassC: {0}", classc.GetType());
}
}
public class ClassB : IClassB
{
public ClassB(IClassC classc)
{
Console.WriteLine("ClassB");
Console.WriteLine(" ClassC: {0}", classc.GetType());
}
}
public class ClassC1 : IClassC
{
public ClassC1()
{
Console.WriteLine("ClassC1");
}
}
public class ClassC2 : IClassC
{
public ClassC2()
{
Console.WriteLine("ClassC2");
}
}
class Program
{
static void Main(string[] args)
{
IContainer container = ConfigureDependencies();
container.GetInstance<IClassA>();
container.GetInstance<IClassB>();
}
private static IContainer ConfigureDependencies()
{
return new Container(x =>
{
x.For<IClassA>().Use<ClassA>();
x.For<IClassB>().Use<ClassB>();
x.For<IClassC>().Use(z => z.RootType == typeof(ClassA) ? (IClassC) z.GetInstance<ClassC1>() : z.GetInstance<ClassC2>());
});
}
}
IClassC
的具体类型由 RootType
决定。
这是输出:
ClassC1
ClassB
ClassC: MongodbEnumerable.ClassC1
ClassA
ClassB: MongodbEnumerable.ClassB
ClassC: MongodbEnumerable.ClassC1
ClassC2
ClassB
ClassC: MongodbEnumerable.ClassC2
表明 ClassC1
用于构造 ClassA
及其依赖项,但用于构造单独的 IClassB
时使用了 ClassC2
。
假设以下 class 结构:
ClassA (IClassB classb, IClassC classc) : IClassA
ClassB (IClassC classc) : IClassB
ClassC1 () : IClassC
ClassC2 () : IClassC
假设我想在 ClassC1
用于具体解析 IClassA
时使用它,即 container.GetInstance<IClassA>()
会 return
new ClassA(
new ClassB (new ClassC1()),
new ClassC1()
)
我可以在 StructureMap 中做这样的事情吗? (理想情况下,类似于 For<ClassA>().Nest(x => x.For<IClassC>().Use<ClassC1>())
,但任何东西都可以。)
这是我得到的:
public interface IClassA
{
}
public interface IClassB
{
}
public interface IClassC
{
}
public class ClassA: IClassA
{
public ClassA(IClassB classb, IClassC classc)
{
Console.WriteLine("ClassA");
Console.WriteLine(" ClassB: {0}", classb.GetType());
Console.WriteLine(" ClassC: {0}", classc.GetType());
}
}
public class ClassB : IClassB
{
public ClassB(IClassC classc)
{
Console.WriteLine("ClassB");
Console.WriteLine(" ClassC: {0}", classc.GetType());
}
}
public class ClassC1 : IClassC
{
public ClassC1()
{
Console.WriteLine("ClassC1");
}
}
public class ClassC2 : IClassC
{
public ClassC2()
{
Console.WriteLine("ClassC2");
}
}
class Program
{
static void Main(string[] args)
{
IContainer container = ConfigureDependencies();
container.GetInstance<IClassA>();
container.GetInstance<IClassB>();
}
private static IContainer ConfigureDependencies()
{
return new Container(x =>
{
x.For<IClassA>().Use<ClassA>();
x.For<IClassB>().Use<ClassB>();
x.For<IClassC>().Use(z => z.RootType == typeof(ClassA) ? (IClassC) z.GetInstance<ClassC1>() : z.GetInstance<ClassC2>());
});
}
}
IClassC
的具体类型由 RootType
决定。
这是输出:
ClassC1
ClassB
ClassC: MongodbEnumerable.ClassC1
ClassA
ClassB: MongodbEnumerable.ClassB
ClassC: MongodbEnumerable.ClassC1
ClassC2
ClassB
ClassC: MongodbEnumerable.ClassC2
表明 ClassC1
用于构造 ClassA
及其依赖项,但用于构造单独的 IClassB
时使用了 ClassC2
。