Как добиться Инъекции свойств, такой как IAbpSession? - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь реализовать свой собственный пользовательский IAbpSession, но я не знаю, как добиться того же внедрения свойства, что и IAbpSession. Мой AppServiceBase похож на ниже:

public abstract class EdwardAppServiceBase : ApplicationService
{
    public TenantManager TenantManager { get; set; }

    public UserManager UserManager { get; set; }

    protected EdwardActiveUnitOfWork EdwardActiveUnitOfWork => (EdwardActiveUnitOfWork)UnitOfWorkManager.Current;

    protected IEdwardSession EdwardSession { get; set; } 
    // protected IEdwardSession EdwardSession => AbpSession as IEdwardSession;

    protected SensingStoreCloudAppServiceBase()
    {
        // EdwardSession = NullEdwardSession.Instance;
        LocalizationSourceName = SensingStoreCloudConsts.LocalizationSourceName;
    }
}

Если я раскомментирую EdwardSession = NullEdwardSession.Instance;, я всегда получаю NullEdwardSession вместо IEdwardSession реализации: EdwardSession.

Я мог только сделать AbpSession as IEdwardSession.

Как ABP вводит IAbpSession и устанавливает его значение в ApplicationService?

1 Ответ

0 голосов
/ 10 мая 2018

ABP использует Castle Windsor для зависимости и внедрение свойства :

Как вводятся свойства

Внедрение свойств зависимостей предназначено для выполнения во время активации компонента при его создании. Ответственность за определение того, какие свойства используются для внедрения, по умолчанию выполняется с помощью PropertiesDependenciesModelInspector - реализации IContributeComponentModelConstruction, которая использует все следующие критерии, чтобы определить, представляет ли свойство зависимость:

  • Имеет «общедоступный» доступный сеттер
  • Является ли свойство экземпляра
  • Если ComponentModel.InspectionBehavior установлено на PropertiesInspectionBehavior.DeclaredOnly, не наследуется
  • Не имеет параметров
  • Не аннотируется атрибутом Castle.Core.DoNotWireAttribute

Так сделай это public:

// protected IEdwardSession EdwardSession { get; set; }
public IEdwardSession EdwardSession { get; set; }
...