我正在尝试通过接口实现我的控制器和视图。这应该允许我将具体类型绑定到DI容器。
我尝试将属性绑定到接口。这给了我一个例外,告诉我无法找到默认构造函数:
ArgumentException:类型'Game.Models.IProduct'没有默认值 构造
经过一些谷歌搜索后,我找到了[FromServices]属性。在我的操作签名中使用它而不是bind属性总是返回一个空实例。这是有道理的,因为属性没有绑定到表单字段。
我想将这两个属性添加到签名中,从而产生下面的代码。这仍然会产生相同的空实例。请注意,索引和获取编辑操作正常工作(构造函数DI工作)。
如果可能的话,我更喜欢不使用其他DI框架的解决方案。
参数名称:type
addTest helper方法:
namespace Microsoft.Extensions.DependencyInjection
{
internal static class ModelsInjector
{
public static void AddTest(this IServiceCollection services)
{
services.AddSingleton<IDataProvider<IProduct>, ProductDataProvider>();
services.AddTransient<IProduct, Product>();
}
}
}
startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.AddTest();
}
ProductController.cs
public class ProductController : Controller
{
protected readonly IDataProvider<IProduct> ProductProvider;
private readonly ILogger _logger;
public ProductController(IDataProvider<IProduct> dataProvider,
ILoggerFactory loggerFactory)
{
ProductProvider = dataProvider;
_logger = loggerFactory.CreateLogger<ProductController>();
}
// GET: Product/Edit/5
public ActionResult Edit(int id)
{
return View(ProductProvider.Read(id));
}
// POST: Product/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int id, [Bind("Id,BaseValue,Name")][FromServices] IProduct product)
{
try
{
ProductProvider.Update(product);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}