对依赖注入的优化想法
1.希望提供新的方法。每个服务都继承或者实现了基类或接口,可以通过基类或接口名来获取服务的实例。
2.对注入的服务,先调用空构造实例化,再调用非空构造注入依赖,或者用其他方法进行依赖注入。这样可以让用户不用考虑注入顺序的问题。
3.希望增加一种新的添加服务的方法。定义自动特性,添加服务时传入匹配规则,将所有自动特性满足匹配规则的类添加服务。这样设计以后,可以更关注新服务的增加,而不用关注对启动类的修改。
4.对静态方法进行特性标记。同样,满足匹配规则的静态方法在配置服务时进行调用,且对其参数要求的服务进行依赖注入。解决的问题同3
一句话总结。我希望我们的代码只需要专注编写模块本身的逻辑,以及模块和模块之间的对接。而不需要关注除此之外的框架逻辑。
[AutoAdd("myapp","myapp2")] //通过AUtoAdd特性的不同参数,可以决定添加服务的时机,以及是否加载。我们只需要关注服务本身的代码
class A :IA
interface IA{
event Action<AArg> HiA;
}
[AutoAdd("myapp")]
class B :IB
interface IB{
void DoB(BArg barg);
}
static class ApplicationExtension{
[AutoUse("myapp")]
static void UseABService(IA a,IB b){
a.HiA+=(e)=>b.DoB(ConvertAToB(e));
//do something
}
}
class Program{
static void Main(string[] arg){
IServiceCollection services=new IServiceCollection();
services.AddAutoService("myapp");//添加所有标记了特性AutoAdd的服务
var provider= services.BuildServiceProvider();
provider.UseAuto();//配置全部标记了特性AutoUse的静态方法,自动注入依赖
//Program类可以最小程度关心,不必经常修改。
}
}