Задать вопрос
@WhiteNinja

C#: Как правильно получить доступ к конфигурациям в доменной модели?

Добрый день!

Есть приложение, к примеру Bug Tracker, разрабатываемое по принципам DDD (Domain Driven Design).
На слое доменной модели (Domain) есть класс:

public class Issue
{
	public int IssueId { get; private set; }
	public string Num { get; private set; }
	
	// ... другие свойства
	
	public DateTime DateClosed { get; private set; } 
	
	private Issue() { } // Для EF
	
	public Issue(string num) : this() 
	{
		Num = num;
	}
	
	public void AcceptToWork()
	{
		// ...
	}
	
	public void Close() 
	{
		if (!DateTime.UtcNow - DateClosed > TimeSpan.FromHours(24)) // Число - "24 часа" хотелось бы перенести в конфигурации
			throw new InvalidOperationException("В данный момент невозможно закрыть задачу");
			
		// ... в противном случае закрывваем задачу
	}
}


Чтобы закрыть задачу (метод Close()) необходимо, чтобы выполнилось условие на проверку прошедшего времени.
Вопрос в том, что хотелось бы перенести значение "24 часа" в файл конфигураций, у нас для этого используется json и собственный менеджер файлов конфигураций: IConfigurationManager.

Правильно ли будет "инжектировать" менеджер конфигураций в сущность следующем образом:

public class Issue
{
	public int IssueId { get; private set; }
	public string Num { get; private set; }
	
	// ... другие свойства
	
	public DateTime DateClosed { get; private set; } 
	
	private readonly DefaultConfiguration _configuration;
	
	private Issue() // Для EF
	{ 
		var configurationManager = IoC.Resolve<IConfigurationManager<DefaultConfiguration>>();
		_configuration = configurationManager.LoadConfiguration();
	} 
	
	public Issue(string num) : this() 
	{
		Num = num;
	}
	
	public void AcceptToWork()
	{
		// ...
	}
	
	public void Close() 
	{
		if (!DateTime.UtcNow - DateClosed > TimeSpan.FromHours(_configuration.PermittedHoursToClose)) // Используем конфигурацию
			throw new InvalidOperationException("В данный момент невозможно закрыть задачу");
			
		// ... в противном случае закрывваем задачу
	}
}


Или есть более правильное решение?
Я немного упроситл пример, на самом деле для переходов по статусам задач используется Stateless framework и соответствующие условия при её настройке:

_workflow.Configure(State.InProgress)
	.Permit(Trigger.Cancel, State.Canceled)
	.PermitIf(Trigger.Close, State.Closed, () => (DateTime.UtcNow - DateClosed) > TimeSpan.FromHours(24)); // Число - "24 часа" хотелось бы перенести в конфигурации
  • Вопрос задан
  • 168 просмотров
Подписаться 1 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
lam0x86
@lam0x86
Лучше не держать ничего лишнего в доменных сущностях. На мой взгляд, следует сделать IIssueService, в который перенести методы AcceptToWork, Close и т.д., которые будут принимать на вход ту Issue, над которой выполняется действие.
И тогда можно конфигурить этот IIssueService различными менеджерами типа IConfigurationManager и IDateTimeProvider.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы