我有一个名为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));
}
}
LogController:
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;
}
}
答案 0 :(得分:1)
你应该可以像这样使用ParameterOverride
:
return DefaultUnityContainer.container
.Resolve(
injectionType,
new ParameterOverride("filename", "myfilenamethatcomesfromconfigfile"));
但请注意,名称filename
的任何参数都会将此值注入其中。
答案 1 :(得分:0)
我刚刚发现我们也可以使用命名注册。在DefaultUnityContainer
中,我们可以像这样注册构造函数 -
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;
}