Есть ли способ сделать это с помощью DI? Я попробовал IScopedInstance<Controller>
, но это дает мне null. Пытался по исходному коду aspnet, но не выиграл. Есть идеи?Есть ли способ получить текущий экземпляр контроллера в ASP.NET 5?
У меня есть контроллер, который принимает разные IPaymentMethod
s. IPaymentMethod
can be ViewComponent
can render Views. Если является ViewComponent
, я хочу, чтобы он использовал встроенную привязку модели MVC для обратной связи.
public class XController : Controller
{
// ctor, props, ...
public IActionResult Checkout()
{
return View(new Model
{
PaymentMethodId = 1,
PaymentMethodType = typeof(MyPaymentMethod) // The razor file will use this type to render it as a ViewComponent
});
}
[HttpPost]
public IActionResult Checkout(Model model)
{
var paymentMethod = _paymentService.GetPaymentMethodById(model.PaymentMethodId);
paymentMethod.ProcessPayment();
// ..
}
}
Это то, где мне нужен контроллер для инъекции. Я хотел использовать встроенную проверку MVC и привязку модели.
public class MyPaymentMethod : IPaymentMethod
{
private Controller _currentController;
public MyPaymentMethod(IScopedInstance<Controller> controller)
{
_currentController = controller.Value;
}
public void ProcessPayment()
{
var model = new PaymentModel();
_currentController.TryUpdateModel(model, typeof(PaymentModel), null);
if (!_currentController.ModelState.IsValid)
{
return; // or exception
}
// Process Payment using model
}
public Task<IViewComponentResult> InvokeAsync()
{
// returns View
}
}
public interface IPaymentMethod
{
void ProcessPayment();
}
Просим предоставить дополнительную информацию. Из какой области или контекста вы пытаетесь получить текущий контроллер? – Dai
Обратите внимание, что вся точка ослабления связи и разъединения состоит в том, что другие слои в вашем приложении должны быть полностью не осведомлены о текущем контроллере. – Dai
@ Дай Правда. Это исключение, хотя из-за того, что класс находится в «сетевом» слое. – Dealdiane