Чтобы 1. прояснить возможности интерфейса и, следовательно, 2. сократить количество тестов плюс 3. потерпеть неудачу как можно быстрее, я намерен обеспечить проверку модели при создании. Модель не должна быть создана, если созвездие недействительно. В результате каждому потребителю гарантируется, что предоставленная модель действительна.
Решение, которое я придумал, заключается в том, чтобы иметь частный конструктор и вложенный фабричный класс.
Но качество кодаправила сообщают о предупреждении проектирования: CA1034 : вложенные типы не должны быть видныКогда подавлять предупреждения: Не подавляйте предупреждение из этого правила.
Существуют ли альтернативные варианты для этого?
public class MyValidatedModel
{
private readonly SomeOtherModel _a;
private readonly SomeOtherModel _b;
// cannot be constructed elsewhere to enforce validation
private MyValidatedModel(SomeOtherModel a, SomeOtherModel b)
{
_a = a;
_b = b;
}
public class Factory
{
private readonly ImmutableList<IValidator> _validators;
// to allow override in tests where simplification wanted
public Factory(IEnumerable<IValidator> validators)
{
this._validators = validators.ToImmutableList();
}
public MyValidatedModel Create(SomeOtherModel a, SomeOtherModel b)
{
// do some validation
if (IsValid(a, b))
{
// create validated model
return new MyValidatedModel(a, b);
}
// do some error handling
}
}
}
public class Consumer
{
public DoStuff(MyValidatedModel model)
{
// here we know for sure that this model is valid
}
}