Мне задали интересный вопрос о том, почему в моем PR члены внутреннего класса были объявлены публичными, а не внутренними.
internal class ProductFamily
{
public int Id { get; set; }
public string FamilyName { get; set; }
}
Моей первой мыслью было «потому что я всегда так делаю», но, поскольку это был вопрос от старшего разработчика, я просто попытался изменить их на внутренние, чтобы положить конец дебатам.
internal class ProductFamily
{
internal int Id { get; set; }
internal string FamilyName { get; set; }
}
Это вызвало проблему с программой, поскольку класс был моделью данных для привязки Win Forms.
Единственным решением было оставить участников открытыми.
Это подняло несколько вопросов, на которые я пришел сюда за ответами, но обнаружил, что, как мы раньше считали, им следует позволить быть внутренними. Связанный вопрос
Я также вспомнил другой шаблон DI, который я использовал в последнее время, где реализации являются внутренними классами, интерфейсы и метод статического расширения для их регистрации находятся в том же проекте, что и общедоступный, и, наконец, для их регистрации вызывается статический метод. Таким образом, сборка, использующая реализации через интерфейс и зарегистрированные службы, не может их видеть, что снижает соблазн создать их экземпляры.
internal class Service : IService
{
public void DoesSomething()
{
...
}
}
public interface IService
{
void DoesSomething();
}
public static class ServiceRegistrationExtension
{
public static IServiceCollection RegisterServices(this IServiceCollection services)
{
services.AddScoped<IService, Service>();
return services;
}
}
Мой вопрос: ошибочны ли эти предположения, или с появлением современных версий C# парадигма изменилась, поэтому наше понимание должно измениться?
Установка внутренних членов вызывала ошибку в привязке форм Win, мы ожидали, что она будет работать нормально, поскольку мы понимаем, что члены имеют ту же видимость, что и класс.
Да, привязка WinForms происходит только к общедоступным свойствам, даже если сами типы являются внутренними. Из обзора привязки данных (выделено мной):
Для простой привязки Windows Forms поддерживает привязку к общедоступным свойствам простого объекта.
Спасибо, благодаря вам я получил эту прямую ссылку Структуры для привязки