В шаблоне 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>();
}
}
Однако, если я получу доступ к этим свойствам в производном классе, они уже будут удалены.Но согласно документации, он должен жить до освобождения моего класса.