控制台应用中静态方法调用非静态方法的Unity依赖注入问题
解决Unity依赖注入下控制台应用Main方法调用非静态服务方法的问题
这是个很典型的控制台应用结合依赖注入的入门问题,我来帮你搞定:
你的核心矛盾在于Main方法必须是静态的,但你的Program类通过构造函数注入了IFooService,导致无法直接在静态方法里调用依赖注入的非静态成员方法。解决方案很简单:让Unity容器来帮你实例化Program类,而不是手动创建,这样既能遵循依赖注入的设计理念,又能正确获取到注入的服务实例。
修改你的Program类代码如下:
class Program { private readonly IFooService _service; public Program(IFooService service) { _service = service; } static void Main(string[] args) { var unity = new UnityContainer(); var unityConfig = new MyUnityConfig(); unityConfig.RegisterTypes(unity); // 关键:让Unity解析Program实例,自动注入所需的IFooService var programInstance = unity.Resolve<Program>(); programInstance.MyFunc(); } public void MyFunc() { Console.WriteLine("Hello world!"); _service.ServiceFunc(); } }
原理说明:
- 你已经在
MyUnityConfig里注册了IFooService和它的实现类FooService,同时也注册了IFooRepository,Unity容器会自动管理这些依赖的实例化。 - 当你调用
unity.Resolve<Program>()时,Unity会检查Program的构造函数,发现它需要一个IFooService实例,接着容器会根据之前的注册,创建FooService的实例(同时自动注入它依赖的FooRepository),最后把这个IFooService实例注入到Program的构造函数中,生成完整的Program实例。 - 这样你就可以通过这个实例调用
MyFunc方法,而_service也已经被正确注入,完全符合依赖注入的设计原则,不需要手动实例化任何依赖。
内容的提问来源于stack exchange,提问作者Cybercop
相关产品推荐
相关产品推荐

