一个简单的依赖注入容器的 优化版本

以上内容展示了如何手动实现一个简单的依赖注入容器,并使用它来配置和注入依赖项。整体上已经非常清晰和实用,但还有一些优化建议可以提高代码的灵活性和可维护性:

优化建议

  1. 类型安全注册和解析: 目前的实现依赖于Func<object>,在解析时需要进行强制转换,可能会导致运行时错误。我们可以使用泛型来提高类型安全性。

  2. 生命周期管理: 当前的实现每次解析都会创建新的实例。如果需要支持单例或其他生命周期管理,可以扩展容器。

  3. 自动属性注入: 可以实现自动属性注入,而不是手动配置每个属性。

优化后的实现

1. 增强的依赖注入容器
 

csharp

public class SimpleContainer
{
    private readonly Dictionary<Type, Func<object>> _registrations = new Dictionary<Type, Func<object>>();
    private readonly Dictionary<Type, object> _singletons = new Dictionary<Type, object>();

    public void Register<TService, TImplementation>() where TImplementation : TService
    {
        _registrations[typeof(TService)] = () => CreateInstance(typeof(TImplementation));
    }

    public void RegisterSingleton<TService, TImplementation>() where TImplementation : TService
    {
        var instance = CreateInstance(typeof(TImplementation));
        _singletons[typeof(TService)] = instance;
        _registrations[typeof(TService)] = () => instance;
    }

    public TService Resolve<TService>()
    {
        return (TService)_registrations[typeof(TService)]();
    }

    private object CreateInstance(Type type)
    {
        var ctor = type.GetConstructors().First();
        var parameters = ctor.GetParameters().Select(p => Resolve(p.ParameterType)).ToArray();
        return Activator.CreateInstance(type, parameters);
    }
}
2. 配置和使用容器
 

csharp

using System;
using System.Windows;

namespace Zhaoxi.BMS
{
    public partial class App : Application
    {
        public static SimpleContainer Container { get; private set; }

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            ConfigureContainer();

            var mainWindow = Container.Resolve<MainWindow>();
            mainWindow.Show();
        }

        private void ConfigureContainer()
        {
            Container = new SimpleContainer();
            Container.Register<MainWindow, MainWindow>();
            Container.Register<MainViewModel, MainViewModel>();
            Container.Register<ICommand, Command>();
        }
    }
}
3. 支持构造函数注入的 MainViewModel
 

csharp

using System.Collections.Generic;
using System.Windows.Input;

namespace Zhaoxi.BMS.ViewModels
{
    public class MainViewModel : NotifyBase
    {
        public List<string> BatteryGroup { get; set; } = new List<string>();

        public ICommand NavCommand { get; }

        public MainViewModel(ICommand navCommand)
        {
            NavCommand = navCommand;
            if (NavCommand is Command command)
            {
                command.DoExecute = SwitchPage;
            }

            for (int i = 0; i < 100; i++)
            {
                BatteryGroup.Add(i.ToString());
            }
        }

        private void SwitchPage(object page)
        {
            var type = Assembly.GetExecutingAssembly().GetType($"Zhaoxi.BMS.Views.Pages.{page}");
            PageObject = Activator.CreateInstance(type);
        }

        private object _pageObject;
        public object PageObject
        {
            get { return _pageObject; }
            set { SetProperty(ref _pageObject, value); }
        }
    }
}

总结

通过上述优化,我们提高了代码的类型安全性和灵活性,并且实现了单例的生命周期管理。同时,构造函数注入的方式使得代码更容易测试和维护。如果有更多复杂的需求,可以考虑引入生命周期管理、属性注入等高级功能,但这些优化已经展示了手动实现依赖注入的一些核心理念和最佳实践。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值