构造函数依赖注入的InvalidCastException

本文关键字:InvalidCastException 注入 函数依赖 | 更新日期: 2023-09-27 17:53:16

我得到了一个使用构造函数依赖注入的服务。在构造函数中,我尝试区分两种类型。根据结果,我想将接口转换为它的实现之一。下面是构造函数:

private readonly IControlService _syncService;
    public CacheService(IControlService syncService)
    {
        if (Config.Config.type == ControlType.Type1) 
        {
            try
            {
                _syncService = (type1Service)syncService;
            }
            catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.ToString()); }
        }
        else if (Config.Config.type == ControlType.Type2)
        {
            _syncService = (type2Service)syncService;
        }  
    }

type1Service和type2Service都实现了接口IControlService。然而,如果控制类型列表为Type1,我得到

03-25 12:38:15.503 I/mono-stdout( 2542): System.InvalidCastException: Cannot cast from source type to destination type.

Type2效果很好。什么好主意吗?

构造函数依赖注入的InvalidCastException

您确定IoC容器正在传递正确的类型吗?这段代码发生了什么?

    if (Config.Config.type == ControlType.Type1) 
    {
        var s = syncService as type1Service;
        if (s == null)
        {
            throw new ArgumentException (
                string.Format ("Expected type: {0}, Actual type: {1}", 
                    typeof(type1Service), 
                    syncService.GetType ()));
        }
    }

谢谢你的帮助!

问题在app.cs和IoC注册代码中,就像Stuart假设的那样。我重命名了两个实现类,并删除了"Service"结尾。所以代码现在像这样强制转换:

_syncService = (Type1)syncService;

和注册看起来像这样:

public override void Initialize()
    {
        CreatableTypes()
            .EndingWith("Service")
            .AsInterfaces()
            .RegisterAsLazySingleton();
        if(Config.Config.type == ControlType.Type1)
        {
            Mvx.RegisterType<IControlService, Type1>();
        }
        else if (Config.Config.type == ControlType.Type2)
        {
            Mvx.RegisterType<IControlService, Type2>();
        }
        RegisterAppStart<ViewModels.FirstViewModel>();
    }
相关文章:
  • 没有找到相关文章