首页 > 解决方案 > 基类中的属性注入

问题描述

在 ASP.NET Boilerplate 模板中,有一个AppServiceBase具有两个属性:TenantManagerUserManager.

如果我需要使用这些属性,我应该执行以下操作:

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>();
    }
}

但是,如果我在派生类中访问这些属性,它们已经被释放了。但是根据文档,它应该一直存在到我的课程发布为止。

标签: c#asp.net-coredependency-injectioncastle-windsoraspnetboilerplate

解决方案


如果您没有在构造函数中使用范围,请不要创建范围。

属性注入模式无需在构造函数中解析即可工作。

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

    ctor()
    {
    }
}

推荐阅读