Я пытаюсь избежать использования анемичной модели предметной области, поэтому я стараюсь сохранить как можно больше логики в самой модели предметной области. У меня есть метод с именем AddIngredient
, который должен добавить новый KeyedObject
к моему Recipe
агрегату.
Поскольку предполагается, что сами доменные модели лишены репозиториев, я получаю ингредиент с помощью бизнес-правила класс:
public class Recipe : AggregateObject
{
public void AddIngredient(int ingId, double quantity)
{
GetIngredientMessage message = new GetIngredientMessage();
message.IngredientId = ingId;
GetIngredient handler = ServiceLocator.Factory.Resolve<GetIngredient>();
Ingredient ingredient = handler.Execute(message);
Ingredients.Add(new OriginalIngredient()
{
Ingredient = ingredient,
Quantity = quantity
});
}
}
Как видите, я использую строку строка ServiceLocator.Factory.Resolve<GetIngredient>();
, чтобы получить класс GetIngredient
моего бизнес-правила. GetIngredient
- это простой обработчик команд, который выглядит следующим образом:
public class GetIngredient : ICommandHandler<Ingredient, GetIngredientMessage>
{
private readonly IIngredientRepository _ingredientRepository;
public GetIngredient(IIngredientRepository ingredientRepository)
{
_ingredientRepository = ingredientRepository;
}
}
Я присваиваю свой класс фабрики IoC ServiceLocator.Factory
, поэтому Домен может использовать свои собственные интерфейсы, не видя конкретную реализацию класса:
ServiceLocator.Factory = new IoCFactory();
Я почти уверен, что делаю что-то не так, потому что все это выглядит немного странно.
- Может кто-нибудь заметить что-то явно не так?
- Есть ли более подходящий способ создания обработчика бизнес-правила, такого как
GetIngredient
, без статической ссылки на мой IoC Factory?