ASP.Net MVC构造器注入与autoface -运行时参数

本文关键字:autoface 运行时 参数 注入 Net MVC 构造器 ASP | 更新日期: 2023-09-27 18:13:26

我是Autofac的新手,在注入只有在运行时才知道参数的依赖项时遇到了一个问题。(下面的代码是我试图描述的问题的一个例子)。

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

public class Bootstrapper
{
    public static void Config()
    {
        var builder = new ContainerBuilder();
        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterType<PersonService>().As<IPersonService>().InstancePerHttpRequest();
        builder.RegisterType<PersonRepository>().As<IPersonRepository>().InstancePerHttpRequest();
        IContainer container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

这些是类型。

public class PersonService : IPersonService
{
    private readonly IPersonRepository _repository;
    public PersonService(IPersonRepository repository)
    {
        _repository = repository;
    }
    public Person GetPerson(int id)
    {
        return _repository.GetPerson(id);
    }
}
public interface IPersonRepository
{
    Person GetPerson(int id);
}
public class PersonRepository : IPersonRepository
{
    private readonly int _serviceId;
    public PersonRepository(int serviceId)
    {
        _serviceId = serviceId;
    }
    public Person GetPerson(int id)
    {
        throw new System.NotImplementedException();
    }
}
然后控制器从构造函数 中获取PersonService。
 public class HomeController : Controller
{
    private readonly IPersonService _service;
    public HomeController(IPersonService service)
    {
        _service = service;
    }
    public ActionResult Index()
    {
        return View();
    }
}

显然,这将会失败,因为容器期望在PersonRepository的构造函数上使用ServiceId参数,并出现以下异常"Cannot resolve parameter 'Int32 ServiceId '"

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

我看了很多文章,论坛等,但似乎没有得到任何地方。

谁能给我指个正确的方向?非常感谢您的帮助。

谢谢

ASP.Net MVC构造器注入与autoface -运行时参数

我知道你使用autoface,但在我们的项目中,我们使用Unity,它绝对可以插入基本类型的类型注册,像这样:

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

看这个

一般来说,您不希望这样做,因为您已经建模了它(您的PersonRepository)。DI是用来解析服务依赖的,你得到的是一个有状态的组件。

建模的方法是使用抽象工厂。Mark Seemann在这个主题上有一篇很好的博客文章。

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