前一段时间,我从事一个我认为使用LightInject的项目。我不再具有访问权限,所以我不能只是去找自己。似乎一旦实例化了ServiceContainer,就会触发所有程序集的反射,并自动实例化特定接口类型的任何属性。像这样:
包含记录器类的C#类库;记录器是应该注入的东西。
namespace TestLightInject {
class Program {
private static ServiceContainer container;
static void Main(string[] args) {
container = new ServiceContainer();
//container.EnableAnnotatedPropertyInjection();
container.Register<ILogger, Logger>();
//container.RegisterPropertyDependency<ILogger>((factory, propertyInfo) => new Logger());
var worker = new Worker();
worker.DoSomething();
}
}
public class Worker {
//[Inject]
ILogger logger { get; set; } = null; // THIS IS THE PROPERTY THAT NEEDS TO BE SET
public Worker() { }
public void DoSomething() { logger.Log("It works!"); }
}
}
一个引用类库的C#控制台应用程序。一些似乎没有帮助的事情被注释掉了。
public Worker() { logger = Program.container.GetInstance<ILogger>(); }
我想我可以允许公众访问服务容器,并将Worker ctor更改为类似
for row in rdd.toLocalIterator():
但是,如果自动实例化任何ILogger属性,则更为简单。
是否可以使用LightInject做到这一点,还是其他DI框架做到了?还是我只是在想象这一切?