如何使用参数覆盖解析正在注入控制器的类型?

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;
        }