覆盖 breeze BeforeSaveEntity()

overriding breeze BeforeSaveEntity()

我遇到了与 breezejs issues with the save bundle 中讨论的完全相同的问题,答案解释得很好。

我遇到的问题是 - 我的应用程序有点大,我们修改了大约 20 多个实体。因此,如果我在我的数据上下文中覆盖 BeforeSaveEntity() 并在其中添加所有业务逻辑,那将非常麻烦。正如我在以下问题中提到的那样,我们确实有明确的关注点分离(注意 half-completed 标题):

那么我是否可以更有条理地完成这项工作?我的意思是在一个存储库中处理相关实体的 BeforeSaveEntity,同样?

当然你可以在你的BeforeSaveEntities方法内部分支,如the answer you linked to above的代码所示。在每个 if 块中,您可以实例化一个助手 class 或存储库来处理每个实体类型。

一种更基于域的方法是拥有 EFContextProvider<MyDbContext> 的多个子class。每个人都有自己的 BeforeSaveEntities 方法来处理自己的域业务规则:

public class AccountManagementContextProvider : EFContextProvider<MyDbContext>
{
    Type[] allowedTypes = new Type[] { typeof(Account), typeof(AccountAddress) };

    protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap)
    {
        var illegalTypes = saveMap.Keys.Except(allowedTypes);
        if (illegalTypes.Any())
        {
            throw new ArgumentException("Attempt to save illegal entities");
        }

        // account management stuff...
    }
}

// in a separate file...
public class InventoryContextProvider : EFContextProvider<MyDbContext>
{
    protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap)
    {
        // inventory stuff...
    }
}        
// etc.

您可以在控制器方法中实例化适当的 ContextProvider 实例:

[HttpPost]
public SaveResult SaveAccount(JObject saveBundle)
{
    var context = new AccountManagementContextProvider();
    return context.SaveChanges(saveBundle);
}

[HttpPost]
public SaveResult SaveInventory(JObject saveBundle)
{
    var context = new InventoryContextProvider();
    return context.SaveChanges(saveBundle);
}

... 您使用 named saves:

从客户端调用
    var saveOptions = new breeze.SaveOptions({ resourceName: 'SaveInventory' });
    return manager.saveChanges(null, saveOptions);