lor*_*jeb 4 c# asp.net-mvc asp.net-web-api asp.net-core
我有一个ASP.NET 5.0(vnext)项目,我正在实现Web Api和Mvc前端.我希望我的Mvc控制器可以调用Web Api控制器,它运行正常.我根据http://www.asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6上的示例构建了api ,它运行良好.Mvc前端可以成功调用WebApi控制器,但是当我从Mvc控制器实例化它时,依赖注入框架不会提供ITodoRepository.
public class Startup
{
public void Configure(IApplicationBuilder app, ILoggerFactory logFactory)
{
...
app.UseServices(services =>
{
services.AddSingleton<ITodoRepository, TodoRepository>();
});
...
[Route("api/[controller]")]
public class TodoController : Controller
{
/* The ITodoRepository gets created and injected, but only when the class is activated by Mvc */
TodoController(ITodoRepository repository)
{
_repository = repository;
}
[HttpGet]
public IEnumerable<TodoItem> Get()
{
return _repository.AllItems;
}
...
public class HomeController : Controller
{
public IActionResult Index()
{
var tc = new TodoController(/* have to create my own ITodoRepository here */);
return View(tc.Get());
}
...
Run Code Online (Sandbox Code Playgroud)
我能够使用[Activate]属性将一个ITodoRepository添加到HomeController,然后将其传递给TodoController的构造函数,但是这并没有将气味测试传递给我.家庭控制器不应该有或甚至不知道那些.
是否有另一种方法来创建将调用DI逻辑并提供依赖关系的TodoController实例?
如果您担心代码异味,主要问题应该是让一个控制器调用另一个控制器.
控制器应在两种情况下调用:
相反,我建议让两个控制器调用业务逻辑组件,该组件本身可能使用依赖注入来获取其依赖关系,并且每个控制器也可能使用依赖注入来获取业务逻辑依赖关系.
public class HomeController : Controller {
public HomeController(IMyAppBusinessLogic bll) { ... }
}
public class WebApiController : Controller {
public WebApiController(IMyAppBusinessLogic bll) { ... }
}
public class MyAppBusinessLogic : IMyAppBusinessLogic {
public MyAppBusinessLogic(ITodoRepository repository) { ... }
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2209 次 |
最近记录: |