覆盖微风BeforeSaveEntity()

时间:2015-01-28 07:07:46

标签: breeze separation-of-concerns savechanges

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

我遇到的问题是 - 我的应用程序有点大,我们修改了大约20多个实体。因此,如果我在我的datacontext中覆盖BeforeSaveEntity()并在那里添加所有业务逻辑,那将非常麻烦。正如我在下面的问题中所提到的那样,我们确实有明确的关注点分离(请注意半完成的标题): Is it a good practice to use multuple

那么我还能以更有条理的方式做到这一点吗?我的意思是在一个存储库中处理相关实体的BeforeSaveEntity,同样呢?

1 个答案:

答案 0 :(得分:2)

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

更基于域的方法是拥有EFContextProvider<MyDbContext>的多个子类。每个人都有自己的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);