Звучит так, как будто вы ищете фабричный шаблон :
Фабричный образец является творческим
шаблон проектирования, используемый в программном обеспечении
разработка для инкапсуляции
процессы, участвующие в создании
объекты.
По сути, ваш класс Provider
является фабрикой, которая контролирует создание экземпляров класса Data
.
Одна вещь, которую вы могли бы контролировать, это поместить эти два типа в их собственную сборку и сделать конструктор для Data
равным internal
, но сам класс public
. Это будет означать, что любой, кто ссылается на сборку, будет вынужден использовать класс Provider
для создания экземпляров Data
(если, конечно, они не использовали отражение).