在“创建/编辑”操作中绑定不与DI一起使用

时间:2017-11-11 10:28:23

标签: c# asp.net-mvc dependency-injection asp.net-core-mvc

我正在尝试通过接口实现我的控制器和视图。这应该允许我将具体类型绑定到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();
            }
        }
    }

0 个答案:

没有答案