Я довольно новичок во всем этом, так что, вероятно, это ООП 101, но я не могу разобраться с этим, предположим, что следующий код C # живет в сборке:
internal interface IDataStore
{
void Store(string name, object data);
object Retrieve(string name);
}
internal class DBStore : IDataStore
{
public DBStore(string connection) { }
public void Store(string name, object data) { }
public object Retrieve(string name) { }
}
public class GizmoManager
{
public GizmoManager(IDataStore dataStore) { }
// Other stuff
}
public class WidgetManager
{
public WidgetManager(IDataStore dataStore) { }
// Other stuff
}
Если вторая сборка пытается создать GizmoManager и WidgetManager, она не может этого сделать, потому что у нее нет способа завладеть DBStore (поскольку она внутренняя, а не публичная).
Следующие не работают AFAICS:
- Сделайте DBStore и IDataStore общедоступными. Плохо, потому что клиентская сборка может затем обойти GizmoManager / WidgetManager и получить доступ к БД так, как ей нравится.
- Не передавайте хранилище IDataStore конструкторам GizmoManager и WidgetManager. Плохо, потому что это снижает тестируемость (вы не можете легко передать в MockDataStore).
- Сделай что-нибудь волшебное с фабриками. Кажется, ничего не решает, потому что вам нужно передать один и тот же IDataStore как в GizmoManager, так и в WidgetManager, и, таким образом, клиентской сборке все еще нужно назначить IDataStore для переменной (чего не может быть, потому что IDataStore является внутренним).
Это, наверное, потрясающе очевидно, но я просто не вижу этого. Как преодолеть это противоречие?
ТИА.