将请求 class 类型传递给请求的 class 构造函数
Passing requesting class type to a requested class constructor
假设我有一个追随者class:
public class Handler
{
public Type RequesterType { get; }
public Handler(Type requesterType)
{
RequesterType = requesterType;
}
}
它本身是另一个 class 的依赖:
public class Controller
{
public Handler Handler { get; }
public Controller(Handler handler)
{
Handler = handler;
}
}
是否可以这样注册 Handler
,当 Controller
被解析时,从属 Handler
的构造函数参数 requesterType
被赋值Controller
类型?
这是我想要实现的示例:
class Program
{
static void Main(string[] args)
{
var container = new WindsorContainer();
container.Register(
Component.For<Controller>()
//Component.For<Handler>(), <- this is the essense of my question
);
var controller = container.Resolve<Controller>();
Console.WriteLine(controller.Handler.RequesterType); //Should output Program.Controller
Console.ReadKey();
}
}
处理此问题的常用方法是使处理程序通用:
public class Handler<T>
{
public Type RequesterType { get { return typeof(T) ; }
}
那么您可以将其作为泛型类型参数传递,而不是在构造函数中传递类型:
public class Controller
{
public Handler<Controller> Handler { get; }
public Controller(Handler<Controller> handler)
{
Handler = handler;
}
}
现在您可以按常规方式为每个控制器注册您的处理程序,它们将解析为正确的类型。
您可能想用接口或协变来修饰它,但这是一般的想法。
假设我有一个追随者class:
public class Handler
{
public Type RequesterType { get; }
public Handler(Type requesterType)
{
RequesterType = requesterType;
}
}
它本身是另一个 class 的依赖:
public class Controller
{
public Handler Handler { get; }
public Controller(Handler handler)
{
Handler = handler;
}
}
是否可以这样注册 Handler
,当 Controller
被解析时,从属 Handler
的构造函数参数 requesterType
被赋值Controller
类型?
这是我想要实现的示例:
class Program
{
static void Main(string[] args)
{
var container = new WindsorContainer();
container.Register(
Component.For<Controller>()
//Component.For<Handler>(), <- this is the essense of my question
);
var controller = container.Resolve<Controller>();
Console.WriteLine(controller.Handler.RequesterType); //Should output Program.Controller
Console.ReadKey();
}
}
处理此问题的常用方法是使处理程序通用:
public class Handler<T>
{
public Type RequesterType { get { return typeof(T) ; }
}
那么您可以将其作为泛型类型参数传递,而不是在构造函数中传递类型:
public class Controller
{
public Handler<Controller> Handler { get; }
public Controller(Handler<Controller> handler)
{
Handler = handler;
}
}
现在您可以按常规方式为每个控制器注册您的处理程序,它们将解析为正确的类型。
您可能想用接口或协变来修饰它,但这是一般的想法。