Внедрение недвижимости в базовый класс - PullRequest
0 голосов
/ 26 мая 2018

В шаблоне ASP.NET Boilerplate есть AppServiceBase, который имеет два свойства: TenantManager и UserManager.

Если мне нужно использовать эти свойства, я должен сделать что-то вроде:

public abstract class BaseClass
{
    public TenantManager TenantManager { get; set; }
    public UserManager UserManager { get; set; }

    ctor(TenantManager service1, UserManager service2)
    {
        TenantManager = service1;
        UserManager = service2;
    }
}

Итак, я запрашиваю эти два в своем производном классе ctor и передаю их в базовый класс:

public class DerivedClass : BaseClass
{
    ctor(TenantManager service1, UserManager service2)
        : base(service1, service2)
    {
    }

    public void SomeMethod()
    {
        // Use base class properties
        TenantManager.Something();
        UserManager.Something();
    }
}

В ASP.NET Core DI я мог бы сделать что-то вроде:

public abstract class BaseClass
{
    public TenantManager Service1 => HttpContext.RequestServices.GetService<TenantManager>();
    public UserManager Service2 => HttpContext.RequestServices.GetService<UserManager>();

    ctor()
    {
    }
}

И производные классы не должны запрашивать их в ctor и передавать их в базовый класс:

public class DerivedClass : BaseClass
{
    ctor(ISpecificService service)
    {
        // I can have other types injected,
        // but TenantManager and UserManager will still be available to use
    }

    public SomeMethod()
    {
        // Use base class properties
        Service1.Something();
        Service2.Something();
    }
}

Итак, как мне достичь чего-то подобного выше в ABP?

Я пытался:

public abstract class BaseClass
{
    public TenantManager TenantManager { get; set; }
    public UserManager UserManager { get; set; }

    ctor()
    {
        var t = IocManager.Instance.CreateScope();
        TenantManager = t.Resolve<TenantManager>(); 
        UserManager = t.Resolve<UserManager>();
    }
}

Однако, если я получу доступ к этим свойствам в производном классе, они уже будут удалены.Но согласно документации, он должен жить до освобождения моего класса.

1 Ответ

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

Не создавайте область, если вы не используете область в конструкторе.

Шаблон внедрения свойства работает без разрешения в конструкторе.

public abstract class BaseClass
{
    public TenantManager TenantManager { get; set; }
    public UserManager UserManager { get; set; }

    ctor()
    {
    }
}
...