覆盖 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);
我遇到了与 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);