Closed qdesk closed 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
方法自动加入到容器的话,则顺序是不可保证的。
综上,拥有多个实现的接口最好手动指定确定的实现,只拥有一个实现的接口可以不指定具体的实现
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特性标签就好。
目前需要加上
[Service(implementInterface: typeof(IAccessService))]
你这个想法我觉得可以,当实现单个接口时可以隐式加入到容器。下个版本支持。
好的,期待下一个版本。
NAutowired 2.1.0 Released
接口注入的时候能够不指定,自动去加载对应的实现类吗,spring 里面就是自己去判断如果没有或者多个会报错。仅有一个的时候不会报错。