【发布时间】:2014-07-18 15:27:10
【问题描述】:
我对 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 参数,并出现以下异常“无法解析参数 'Int32 serviceId'”
知道 HttpContext.Request.Current.Url 后就可以获取 serviceId,但是在创建 Container 时并不知道。
我看过很多文章、论坛等,但似乎没有得到任何结果。
谁能指出我正确的方向。非常感谢您的帮助。
谢谢
【问题讨论】:
标签: c# asp.net asp.net-mvc dependency-injection autofac