不在sportsstore asp.net mvc 5中实现接口

时间:2014-03-03 19:27:55

标签: c# asp.net asp.net-mvc interface asp.net-mvc-5

我正在通过apress关注asp.net mvc 5的书,我因此错误而陷入困境:

  

“SportsStore.Domain.Concrete.EFProductRepository”未实现   接口成员   “SportsStore.Domain.Abstract.IProductRepository.Products.set“

这就是我在EFProductRepository中所拥有的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;

namespace SportsStore.Domain.Concrete
{
    public class EFProductRepository : IProductRepository
    {
        public EFDbContext context = new EFDbContext();

        public IEnumerable<Product> Products
        {
            get { return context.Products; }
        }       
    }
}

在IProductRepository中我有:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SportsStore.Domain.Entities;

namespace SportsStore.Domain.Abstract
{
    public interface IProductRepository
    {
        IEnumerable<Product> Products { get; set; }
    }
}

知道我为什么在EFProductRepository.cs类中收到错误? 提前感谢Laziale的所有建议

2 个答案:

答案 0 :(得分:5)

因为您没有为该属性实现setter。查看界面的定义:

IEnumerable<Product> Products { get; set; }

看看你的实施:

public IEnumerable<Product> Products
{
    get { return context.Products; }
}

您需要在属性中实现set,或从接口定义中删除set。鉴于该物业的实施,我猜测后者更合适。


如果它有帮助,因为看起来你正在构建Entity Framework对象的存储库,这是我的一般看起来像:

public interface ProductRepository
{
    IQueryable<Product> Products { get; }
    void Add(Product model);
    void Remove(Product model);
}

和实施:

public class ProductRepositoryImplementation : ProductRepository
{
    private DbSet<Product> _products;

    public IQueryable<Product> Products
    {
        get { return _products; }
    }

    public ProductRepositoryImplementation(DbSet<Product> products)
    {
        _products = products;
    }

    public void Add(Product model)
    {
        _products.Add(model);
    }

    public void Remove(Product model)
    {
        _products.Remove(model);
    }
}

通常,它位于工作对象单元内,工作对象扩展DbContext并处理将更改提交到其存储库。 (这也是将DbSet<>传递给存储库的构造函数的原因。)我今天实际上just blogged关于此设置。

答案 1 :(得分:2)

错误似乎很清楚 - 您需要在属性中添加set访问者或从界面中删除它。在您的情况下,从界面中删除它可能更有意义:

namespace SportsStore.Domain.Abstract
{
    public interface IProductRepository
    {
        IEnumerable<Product> Products { get; /*set;*/ }
    }
}

通过set访问器将实体添加到存储库似乎不合适 - 通常存储库具有SaveUpdate方法,一次只能在一个实体上运行。