kirov-opensource / NAutowired

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

接口注入的问题 #7

Closed qdesk closed 4 years ago

qdesk commented 4 years ago

接口注入的时候能够不指定,自动去加载对应的实现类吗,spring 里面就是自己去判断如果没有或者多个会报错。仅有一个的时候不会报错。

FatTigerWang commented 4 years ago

接口注入的时候能够不指定,自动去加载对应的实现类吗,spring 里面就是自己去判断如果没有或者多个会报错。仅有一个的时候不会报错。

可以不指定,如果只有一个实现则会取到对应的实现,如果有多个实现,则取决于加入到容器的先后顺序,最后加入到容器实例将会被还原。 例如:

public interface IService { }
public class Foo: IService { }
public class Bar: IService { }

public class Startup {
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddControllersAsServices();
        //replace `IControllerActivator` implement.
        services.Replace(ServiceDescriptor.Transient<IControllerActivator, NAutowiredControllerActivator>());
        services.AddScoped<IService, Foo>();
        services.AddScoped<IService, Bar>();
    }
}

以上会还原出Bar实例,如果使用AutoRegisterDependency方法自动加入到容器的话,则顺序是不可保证的。 综上,拥有多个实现的接口最好手动指定确定的实现,只拥有一个实现的接口可以不指定具体的实现

qdesk commented 4 years ago

public interface IAccessService { } public interface IUserService { } [Service] public class AccessService: IAccessService { } [Service] public class UserService: IUserService { }

public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddControllersAsServices(); //replace IControllerActivator implement. services.Replace(ServiceDescriptor.Transient<IControllerActivator, NAutowiredControllerActivator>());

}

}

在controller里面这样写 [Autowired] public IAccessService AccessService { get; set; } [Autowired] public IUserService UserService { get; set; }

我这样死活注入不了,提示Unable to resolve dependency IAccessService
不知道是不是我写的问题。我是想能够spring boot 那样简便就好。 后面我试过在service 类上面把特性 service 改成 [Service(implementInterface: typeof(IAccessService))]这样就没问题。我只是想偷个懒,如果只有一个实现类的时候就不用写这个implementInterface: typeof(IAccessService。就加一个service特性标签就好。

FatTigerWang commented 4 years ago

目前需要加上

[Service(implementInterface: typeof(IAccessService))]

你这个想法我觉得可以,当实现单个接口时可以隐式加入到容器。下个版本支持。

qdesk commented 4 years ago

好的,期待下一个版本。

FatTigerWang commented 4 years ago

NAutowired 2.1.0 Released