如何使用参数覆盖解析正在注入控制器的类型?
How to resolve a type that is being injected to a controller, with parameter override?
我有一个名为 Tracer
的类型,它被注入到一个控制器中,比如 LogController
并且 Tracer
的构造函数接受一个运行时参数。现在我必须使用 ParameterOverride()
选项,但是由于控制器工厂会自动解析构造函数注入,所以我无法通过 ParameterOverride()
执行此操作。那么有人能告诉我如何实现吗?
示踪剂:
public class Tracer:ITracer
{
private readonly string _filename;
public Tracer(string filename)
{
this._filename = filename;
}
public void TraceLog() //ITracer impl
{
Debug.Write(string.Format("filename is {0}",_filename));
}
}
日志控制器:
public class LogController : Controller
{
//
// GET: /Log/
private readonly ILogger _Logger ;
private readonly Itracer _tracer ;
public LogController(ILogger Logger,Itracer tracer)
{
this._Logger = Logger;
this._tracer = tracer;
}
public ActionResult Index()
{
_Logger.AddLog("index of log ctrl");
_Logger.Save();
_tracer.TraceLog();
return View();
}
public void Dispose()
{
this.Dispose();
}
}
Unity 注册
public static class DefaultUnityContainer
{
public static IUnityContainer container;
static DefaultUnityContainer()
{
container = new UnityContainer();
}
public static void Initialize()
{
container.RegisterType<ILogger, Logger>();
container.RegisterType<Itracer, Tracer>(new InjectionConstructor(typeof(string)));
}
}
控制器工厂:
public class UnityControllerFactory:DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
Type injectionType = null;
if (controllerType == typeof(LogController))
{
injectionType = typeof(LogController);
}
else
{
injectionType = typeof (HomeController);
}
return DefaultUnityContainer.container.Resolve(injectionType) as Controller;
}
}
您应该可以像这样使用 ParameterOverride
:
return DefaultUnityContainer.container
.Resolve(
injectionType,
new ParameterOverride("filename", "myfilenamethatcomesfromconfigfile"));
但请注意,名称为 filename
的任何参数都会注入此值。
我刚刚发现我们也可以使用this.InDefaultUnityContainer
的命名注册,我们可以像这样注册构造函数-
container.RegisterType<Itracer, Tracer>("GetFilenameFromConfigFile",new InjectionConstructor(ConfigHelper.Getfilename())); // provides the filename from the config file assuming its get initialized before the usage.
然后我们可以在构造函数中使用依赖装饰器
public LogController(ILogger Logger,[Dependecy("GetFilenameFromConfigFile")]Itracer tracer)
{
this._Logger = Logger;
this._tracer = tracer;
}
我有一个名为 Tracer
的类型,它被注入到一个控制器中,比如 LogController
并且 Tracer
的构造函数接受一个运行时参数。现在我必须使用 ParameterOverride()
选项,但是由于控制器工厂会自动解析构造函数注入,所以我无法通过 ParameterOverride()
执行此操作。那么有人能告诉我如何实现吗?
示踪剂:
public class Tracer:ITracer
{
private readonly string _filename;
public Tracer(string filename)
{
this._filename = filename;
}
public void TraceLog() //ITracer impl
{
Debug.Write(string.Format("filename is {0}",_filename));
}
}
日志控制器:
public class LogController : Controller
{
//
// GET: /Log/
private readonly ILogger _Logger ;
private readonly Itracer _tracer ;
public LogController(ILogger Logger,Itracer tracer)
{
this._Logger = Logger;
this._tracer = tracer;
}
public ActionResult Index()
{
_Logger.AddLog("index of log ctrl");
_Logger.Save();
_tracer.TraceLog();
return View();
}
public void Dispose()
{
this.Dispose();
}
}
Unity 注册
public static class DefaultUnityContainer
{
public static IUnityContainer container;
static DefaultUnityContainer()
{
container = new UnityContainer();
}
public static void Initialize()
{
container.RegisterType<ILogger, Logger>();
container.RegisterType<Itracer, Tracer>(new InjectionConstructor(typeof(string)));
}
}
控制器工厂:
public class UnityControllerFactory:DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
Type injectionType = null;
if (controllerType == typeof(LogController))
{
injectionType = typeof(LogController);
}
else
{
injectionType = typeof (HomeController);
}
return DefaultUnityContainer.container.Resolve(injectionType) as Controller;
}
}
您应该可以像这样使用 ParameterOverride
:
return DefaultUnityContainer.container
.Resolve(
injectionType,
new ParameterOverride("filename", "myfilenamethatcomesfromconfigfile"));
但请注意,名称为 filename
的任何参数都会注入此值。
我刚刚发现我们也可以使用this.InDefaultUnityContainer
的命名注册,我们可以像这样注册构造函数-
container.RegisterType<Itracer, Tracer>("GetFilenameFromConfigFile",new InjectionConstructor(ConfigHelper.Getfilename())); // provides the filename from the config file assuming its get initialized before the usage.
然后我们可以在构造函数中使用依赖装饰器
public LogController(ILogger Logger,[Dependecy("GetFilenameFromConfigFile")]Itracer tracer)
{
this._Logger = Logger;
this._tracer = tracer;
}