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

时间:2016-05-11 09:18:00

标签: c# asp.net-mvc-4 dependency-injection inversion-of-control unity-container

我有一个名为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;
        }
    }

error screen

2 个答案:

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