Приведенные выше ответы отвечают на заданный вопрос, но, чтобы пойти немного дальше:
Это одна из техник, которую мы используем для инверсии управления и обеспечения возможности модульного тестирования.
Вот оба конструктора
public AccountMembershipService()
: this(null)
{
}
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider ?? Membership.Provider;
}
Первый конструктор с: this (null) вызывает ваш второй конструктор, передавая null провайдеру параметров.
Одна из причин сделать это состоит в том, чтобы избежать дублирования логики. Предположим, вы сделали:
public AccountMembershipService()
{
_provider = Membership.Provider;
}
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider;
}
Совершенно разумно, если вы измените имя _provider или, возможно, добавите какой-либо другой код инициализации, вам придется изменить его в 2 местах. Позвонив по телефону: this (null), теперь вся ваша работа просто происходит в одном месте.
Причина, по которой у нас есть 2 конструктора, заключается в том, что при вызове конструктора по умолчанию используется статический экземпляр Membership.Provider. К сожалению, было бы очень сложно провести модульное тестирование, потому что теперь у нас есть зависимости от поставщиков членства, от базы данных, наличия действительных данных и т. Д.
Вместо этого, создав 2-й конструктор, мы теперь можем передать фиктивный MembershipProvider. Это совершенно другая тема, поэтому, если вам интересно, как это работает, не стесняйтесь задавать другой вопрос.