Конечно, вы можете разветвляться внутри своего метода BeforeSaveEntities
, как показано в коде ответ, на который вы ссылались выше. Внутри каждого блока 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);
}
... который вы вызываете из клиента, используя именованные сохранения:
var saveOptions = new breeze.SaveOptions({ resourceName: 'SaveInventory' });
return manager.saveChanges(null, saveOptions);
person
Steve Schmitt
schedule
28.01.2015