上面展示了如何手动实现一个简单的依赖注入容器并使用它来配置和注入依赖项。总的来说,它非常清晰和实用,但有一些优化建议将使您的代码更加灵活和可维护。
优化建议
类型安全的注册和解析:当前的实现依赖于Funcobject,它需要在解析期间进行强制转换,这可能会导致运行时错误。您可以使用泛型来提高类型安全性。
生命周期管理:当前的实现每次解析时都会创建一个新实例。容器可以根据需要进行扩展以支持单例和其他生命周期管理。
自动属性注入:您可以实现自动属性注入,而不是手动配置每个属性。
优化后的实现
1. 增强的依赖注入容器
升C
公共类SimpleContainer
{
私有只读DictionaryType, Funcobject _registrations=new DictionaryType, Funcobject();
私有只读DictionaryType, object _singletons=new DictionaryType, object();
public void RegisterTService, TImplementation() 其中TImplementation : TService
{
_registrations[typeof(TService)]=()=CreateInstance(typeof(TImplementation));
}
公共无效RegisterSingletonTService,TImplementation()其中TImplementation : TService
{
var 实例=CreateInstance(typeof(TImplementation));
_singletons[typeof(TService)]=实例;
_registrations[typeof(TService)]=()=实例;
}
公共TService ResolveTService()
{
返回(TService)_registrations[typeof(TService)]();
}
私有对象CreateInstance(类型类型)
{
var ctor=type.GetConstructors().First();
var 参数=ctor.GetParameters().Select(p=Resolve(p.ParameterType)).ToArray();
返回Activator.CreateInstance(类型,参数);
}
}
2. 配置和使用容器
升C
使用系统;
使用系统.Windows。
命名空间Zhaoxi.BMS
{
公共部分类应用程序:应用程序
{
公共静态SimpleContainer 容器{ 获取;
protected Override void OnStartup(StartupEventArgs e)
{
Base.OnStartup(e);
配置容器();
var mainWindow=Container.ResolveMainWindow();
mainWindow.Show();
}
私有无效配置容器()
{
容器=新的SimpleContainer();
Container.RegisterMainWindow, MainWindow();
Container.RegisterMainViewModel, MainViewModel();
容器.RegisterICommand, Command();
}
}
}
3. 支持构造函数注入的 MainViewModel
升C
使用System.Collections.Generic。
使用系统.Windows.输入。
命名空间Zhaoxi.BMS.ViewModels
{
公共类MainViewModel : NotifyBase
{
公共Liststring BatteryGroup { set }=new Liststring();
公共ICommand 导航命令{ 获取}
公共MainViewModel(ICommand navCommand)
{
导航命令=导航命令;
if(NavCommand 是命令命令)
{
命令.DoExecute=SwitchPage;
}
for (int i=0; i 100; i++)
{
BatteryGroup.Add(i.ToString());
}
}
private void SwitchPage(对象页面)
{
var type=Assembly.GetExecutingAssembly().GetType($\’Zhaoxi.BMS.Views.Pages.{page}\’);
PageObject=Activator.CreateInstance(类型);
}
私有对象_pageObject;
公共对象PageObject
{
获取{返回_pageObject}
设置{ SetProperty(ref _pageObject, value) }
}
}
}
总结
上述优化提高了代码的类型安全性和灵活性,并实现了单例生命周期管理。同时,构造函数注入使您的代码更易于测试和维护。如果您有更复杂的需求,可以考虑引入生命周期管理或属性注入等高级功能,但这些优化为手动实现依赖注入提供了一些核心支持概念和最佳实践已经得到验证。
#以上关于简单依赖注入容器优化版本的相关内容来源网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91488.html