我遇到与breezejs issues with the save bundle中讨论的完全相同的问题,答案解释得很好。
我遇到的问题是 - 我的应用程序有点大,我们修改了大约20多个实体。因此,如果我在我的datacontext中覆盖BeforeSaveEntity()并在那里添加所有业务逻辑,那将非常麻烦。正如我在下面的问题中所提到的那样,我们确实有明确的关注点分离(请注意半完成的标题): Is it a good practice to use multuple
那么我还能以更有条理的方式做到这一点吗?我的意思是在一个存储库中处理相关实体的BeforeSaveEntity,同样呢?
答案 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);