.NET Framework 4.0 WinForms应用兼容的Microsoft.Extensions.DependencyInjection版本
.NET Framework 4.0 WinForms 依赖注入实现方案
官方的Microsoft.Extensions.DependencyInjection包最低支持.NET Framework 4.6.1,无法直接在4.0版本中使用。以下是几种可行的替代方案:
1. 使用第三方DI容器
Autofac
Autofac支持.NET Framework 4.0,是生态成熟的DI容器,适配WinForms场景。
- 安装兼容版本的NuGet包:选择Autofac 4.9.4(该版本明确支持.NET Framework 4.0)
- 示例配置:
// Program.cs中配置容器 var builder = new Autofac.ContainerBuilder(); // 注册服务与实现,单例模式 builder.RegisterType<MyService>().As<IMyService>().SingleInstance(); // 注册窗体 builder.RegisterType<MainForm>(); var container = builder.Build(); // 启动应用,从容器解析窗体 Application.Run(container.Resolve<MainForm>());
- 窗体构造函数注入依赖:
public class MainForm : Form { private readonly IMyService _myService; // 通过构造函数接收注入的服务 public MainForm(IMyService myService) { _myService = myService; InitializeComponent(); } }
Unity
Unity同样支持.NET Framework 4.0,配置逻辑直观:
- 安装兼容版本的NuGet包:Unity 4.0.1
- 示例配置:
var container = new Unity.UnityContainer(); // 注册单例服务 container.RegisterType<IMyService, MyService>(new Unity.Lifetime.ContainerControlledLifetimeManager()); container.RegisterType<MainForm>(); Application.Run(container.Resolve<MainForm>());
2. 手写轻量DI容器
如果不想引入第三方依赖,可针对简单场景实现自定义DI容器:
public static class ServiceContainer { private static readonly Dictionary<Type, Type> _serviceMap = new Dictionary<Type, Type>(); private static readonly Dictionary<Type, object> _singletonInstances = new Dictionary<Type, object>(); // 注册服务与实现 public static void Register<TService, TImplementation>() where TImplementation : TService { _serviceMap[typeof(TService)] = typeof(TImplementation); } // 注册单例服务 public static void RegisterSingleton<TService, TImplementation>() where TImplementation : TService, new() { _serviceMap[typeof(TService)] = typeof(TImplementation); _singletonInstances[typeof(TService)] = new TImplementation(); } // 解析服务 public static TService Resolve<TService>() { return (TService)Resolve(typeof(TService)); } private static object Resolve(Type serviceType) { // 先检查单例实例 if (_singletonInstances.TryGetValue(serviceType, out var instance)) { return instance; } if (!_serviceMap.TryGetValue(serviceType, out var implementationType)) { throw new InvalidOperationException($"未注册服务:{serviceType.Name}"); } // 构造函数注入(简化处理,取第一个构造函数) var constructor = implementationType.GetConstructors().First(); var parameters = constructor.GetParameters() .Select(param => Resolve(param.ParameterType)) .ToArray(); return Activator.CreateInstance(implementationType, parameters); } }
使用方式:
// 注册服务 ServiceContainer.RegisterSingleton<IMyService, MyService>(); ServiceContainer.Register<MainForm>(); // 启动应用 Application.Run(ServiceContainer.Resolve<MainForm>());
内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

