kirov-opensource / NAutowired

ASP.NET CORE Field Injection Implement
MIT License
77 stars 16 forks source link

[Autowired]在抽象类里面使用的问题 #9

Closed jrt324 closed 4 years ago

jrt324 commented 4 years ago

[Autowired]在抽象类内部适用,注入不了值

public abstract class Repository{
        [Autowired]
        protected IRBACService rbacSvc;
}

public class RoleRepository: Repository{
        [Autowired]
        protected IRBACService rbacSvc111;

        public void Test(){
            // 这里rbacSvc是空的, 而rbacSvc111 是可以正常注入的
            rbacSvc.GetRoles();
        }
}
FatTigerWang commented 4 years ago

抽象类是无法被实例化的,因此注入抽象类到容器是无法支持的(即使用ASP.NET Core的原生的注入方式也是无法注入的),只能使用子类继承此抽象类进行实例化。

推荐阅读:

jrt324 commented 4 years ago

我是使用子类继承此抽象类进行实例化。 你看我给出的RoleRepository是继承至Repository

FatTigerWang commented 4 years ago

根据你的描述: FooService

[Service]
public class FooService
{
}

AbstractService

public abstract class AbstractService
{
    [Autowired]
    protected readonly FooService fooService;
}

BasedAbstractService

[Service]
public class BasedAbstractService : AbstractService
{
    public FooService GetFooService() { return fooService; }
}

进行单元测试

UnitTest

[Fact]
public void TestBasedAbstractService()
{
    var service = consoleHost.GetService<BasedAbstractService>();
    Assert.NotNull(service.GetFooService());
    Assert.IsType<FooService>(service.GetFooService());
}

输出:

正在执行测试方法“NAutowired.Console.Test.UnitTest.TestBasedAbstractService” ----------正在启动测试运行---------- [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.1 (32-bit .NET Core 3.1.5) [xUnit.net 00:00:00.38] Starting: NAutowired.Console.Test [xUnit.net 00:00:00.49] Finished: NAutowired.Console.Test ========== 测试运行已完成: 1.1 秒 中运行 1 个测试(1 个已通过,0 个失败,0 个已跳过) ==========

根据你的描述,建议查看IRBACService类是否增加了[Service]特性(也可手动通过service.AddScoped()添加到容器)。