适用于Entity Framework和ASP .NET应用程序结构的设计

时间:2019-07-09 05:46:03

标签: c# entity-framework design-patterns .net-core project-structuring

我目前正在尝试了解如何更好地为ASP.NET应用程序构建代码,但是我不清楚应该朝哪个方向发展。我想知道我是否可以对到目前为止的情况有所了解,以了解自己是否走对了路,还是完全错过了目标。

从我的研究中收集到的信息:

  • 由于Entity Framework已经完成了自己的伪实现,因此Repository模式似乎没有意义。除非您打算使用除实体框架以外的其他框架,否则通常的共识是直接使用实体框架而不添加不必要的抽象。

  • 服务层/模式利用存储库来实现业务逻辑,并且可能比使用考虑实体框架结构的存储库更好。

我目前正在考虑以下设计,但从长远来看,我不确定这是合适的还是好的做法;

public class Manufacturer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
    public string Website { get; set; }
}

public class Asset
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int ManufacturerId { get; set; }

    public virtual Manufacturer Manufacturer { get; set; }
}

// Generic Queries used within views for select lists and lookups.
public static class GenericManufacturerQueries
{
    public static List<Manufacturer> GetAll(InventoryDb context)
    {
        return context.Manufacturer.ToList();
    }

    public static List<Manufacturer> GetById(int id, InventoryDb context)
    {
        return context.Manufacturer.Where(x => x.Id == id).FirstOrDefault();
    }

    ...omitted for brevity...
}

// Service class to facilitate Create/Update/Delete for each primary entity.
// Code could be too long for posting but the omitted sections also include
// creating/writing differences to a log of the sort. Hence, service classes
// also operate on auxiliary entities. 
public class AssetService
{
    private InventoryDbContext _context = null;

    public AssetService(InventoryDb context)
    {
        _context = context;
    }

    public void AddAsset(Asset model)
    {
        ...omitted for brevity...
    }

    public void RemoveAsset(int assetId)
    {
        ...omitted for brevity...
    }

    public void UpdateAsset(Asset model)
    {
        ...omitted for brevity...
    }
}

在视图模型中可能的用法:

public class AssetCreateVM
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public ManufacturerId { get; set; }

    public List<SelectListItem> Manufacturers
    {
        get
        {
            using(var context = new InventoryDbContext())
            {
                  return GenericModelQueries.GetAll(context)
                                            .Select(x => new  SelectListItem() { Text = x.Name, Value = x.Id }).ToList();
            }
        }
  }

  public void SaveModel()
  {
      using(var context = new InventoryDbContext())
      {
          AssetService service = new AssetService(context);
          var model = new Asset()
                          {
                               Name = this.Name,
                               Description = this.Description,
                               ManufacturerId = this.ManufacturerId,
                          };

            service.AddAsset(model);
        }
    }
}

关于设计,我当时的想法如下:

  • 我在每个数据库表的数据层中都有实体类。通过实体框架的DbContext管理CRUD操作访问。

  • 对于泛型查询,我正在考虑将其整合到一个静态/泛型类中,而该类不必进行实例化,从而避免了重写代码。为了保持一致/最新的事务,我将上下文作为参数传递给类中的每个函数。

  • 使用封装CRUD操作的服务,我可以潜在地在视图模型以外的其他模块和应用程序区域中重新使用逻辑。

  • 我正在考虑通过Entity Effort库注入模拟上下文来为服务编写测试,但是我不确定在此阶段将如何做。

    < / li>

感谢您的时间。

0 个答案:

没有答案