C# ASP.NETMVC构造函数注入与Autofac-运行时参数

C# ASP.NETMVC构造函数注入与Autofac-运行时参数,c#,asp.net,asp.net-mvc,dependency-injection,autofac,C#,Asp.net,Asp.net Mvc,Dependency Injection,Autofac,我对Autofac相当陌生,在注入依赖项时遇到了一个问题,这些依赖项的参数只有在运行时才知道。(下面的代码是我试图描述的问题的一个示例) 这里是我设置容器的地方(在Global.asax中调用) 然后控制器接受构造函数中的PersonService public class HomeController : Controller { private readonly IPersonService _service; public HomeController(IPersonS

我对Autofac相当陌生,在注入依赖项时遇到了一个问题,这些依赖项的参数只有在运行时才知道。(下面的代码是我试图描述的问题的一个示例)

这里是我设置容器的地方(在Global.asax中调用)

然后控制器接受构造函数中的PersonService

 public class HomeController : Controller
{
    private readonly IPersonService _service;

    public HomeController(IPersonService service)
    {
        _service = service;
    }

    public ActionResult Index()
    {
        return View();
    }

}
显然,由于容器在PersonRepository的构造函数上需要ServiceId参数,并且出现以下异常“无法解析参数‘Int32 ServiceId’”,因此这将失效

一旦知道HttpContext.Request.Current.Url,我就可以获得serviceId,但是在创建容器时还不知道

我看过很多文章,论坛等,但似乎没有什么进展

谁能给我指一下正确的方向吗。非常感谢你的帮助


谢谢

我知道您使用autofac,但在我们的项目中,我们使用Unity,它肯定可以像这样插入基本类型以进行类型注册:

container.RegisterTypeWithParams<INewsRepository, NewsRepository>("ConnectionString", typeof(ILoggedUser));
container.RegisterTypeWithParams(“ConnectionString”,typeof(ilogeduser));

请看

一般来说,您不希望在建模时这样做(您的PersonRepository)。DI用于解决服务依赖关系,您拥有的是一个有状态组件

建模的方法是使用抽象工厂。马克·希曼在这个问题上有自己的见解


正如您在评论中所指出的,通过方法注入传递值也是一个选项,但如果需要通过多个依赖项传递,则传递值可能会很难看。

只有在注册时已知值时,这才有效。他/她需要一个只有在运行时才知道的值。感谢您的评论。如何在运行时解析参数?我想我需要以某种方式解决控制器中的依赖关系?好的,我现在明白了。。。我认为这不是一个好办法。使用IOC向创建对象发送运行时值。简,我自己也开始这么想了。也许重构依赖项并向其中一个方法添加参数会是一个更好的方法。我觉得它更好更普通谢谢,我会看看那篇文章。我觉得某处有点异味。实际上,我遇到问题的代码是在我的团队采用DI和TDD之前构建的,并且是在运行时更新的!也许是时候进行重构了!
 public class HomeController : Controller
{
    private readonly IPersonService _service;

    public HomeController(IPersonService service)
    {
        _service = service;
    }

    public ActionResult Index()
    {
        return View();
    }

}
container.RegisterTypeWithParams<INewsRepository, NewsRepository>("ConnectionString", typeof(ILoggedUser));