.net Unity + C# -“依赖关系解析失败”

m3eecexj  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(182)

我的应用程序有10个WCFService(.NET Framework 3.5平台上的WCFService应用程序),它们具有相同的软件和硬件,但只有1个出现此异常:

当用户登录时调用此方法:

public IService Select(SelectServiceRequest request)
        {
            IAxxxService anagServ = IoC.Container.Resolve<IAxxxService>(request.GetRegisteredService().ToString());
            return xxxServ;
        }
  • 第一次执行时使用ClientIdentifier = 0的GetRegisteredService()实作
public RegisteredServices GetRegisteredService()
    {
        RegisteredServices res = RegisteredServices.Estxxx;
        if (ClientIdentifier == 0)
        {
            res = RegisteredServices.Anaxxx;
        }
        else if (ClientIdentifier == 1)
        {
            res = RegisteredServices.Prixxx;
        }
        else if (ClientIdentifier == 2)
        {
            res = RegisteredServices.Estrxxx;
        }

        else if (ClientIdentifier == 3)
        {
            res = RegisteredServices.LixxAnagrxx;
        }

        return res;
    }
  • IOC代码实施和初始化:
internal class IoC{
  private static IUnityContainer container = new UnityContainer();
  private static bool isInitialized = false;

public static IUnityContainer Container
{
    get
    {
        if (!isInitialized)
        {
            lock (container)
            {
                if (!isInitialized)

                    container.RegisterType<IService, EstxxService>(RegisteredServices.Esxxxxx.ToString());
                    container.RegisterType<IService, StaxxxService>(RegisteredServices.Anaxxxx.ToString());
                    container.RegisterType<IService, PrixxxService>(RegisteredServices.Prixxxx.ToString()); 
                    container.RegisterType<IService, LixxxAxxxService>(RegisteredServices.LixxxAnagxx.ToString()); 
                                isInitialized = true;

                }
            }
        }
        return container;
    }

}

}
我在执行方法“Resolve”时遇到此异常:
系统.反射.目标调用异常:异常已由调用的目标抛出。---〉Microsoft.Practices.Unity.ResolutionFailedException:依赖关系解析失败,类型=“ApCon.IService”,名称=“Anagxxx”。异常消息为:当前生成操作(生成键Build Key[ApCon.StandardService,Anaxxxx])失败:当前生成操作(生成键Build Key[ApCon.StandardService,Anaxxxx])失败:索引超出数组的边界。(策略类型DynamicMethodConstructorStrategy,索引0)(策略类型BuildPlanStrategy,索引3)---〉Microsoft. Practices. ObjectBuilder 2.生成失败异常:当前生成操作(生成键Build Key[ApCon.StandardService,Anagrafe])失败:当前生成操作(生成键Build Key[ApCon.StandardService,Anagrafe])失败:索引在数组的边界之外。(策略类型DynamicMethodConstructorStrategy,索引0)(策略类型BuildPlanStrategy,索引3)---〉Microsoft. Practices.对象生成器2.生成失败异常:当前生成操作(生成键Build Key[ApCon.StandardService,Anagxxx])失败:索引超出数组的边界。(策略类型DynamicMethodConstructorStrategy,索引0)---〉系统。索引超出范围异常:索引超出数组的界限。在系统中的集合中的一般属性。列表1。在Microsoft中的Add(T项)。实践中的对象生成器2。依赖关系解析器跟踪器策略。AddResolverKey(对象键)在Microsoft中的实践中的对象生成器2。构造函数选择器策略库1。创建选定的构造函数(IBuilderContext context,构造器信息构造函数)。构造器选择器策略库1。选择构造器(IBuilderContext上下文)。内部异常堆栈跟踪的结尾---位于
可能是锁定指令吗?似乎类型未注册,isInitialized变为true

icnyk63a

icnyk63a1#

据我所知,您正在注册IAnagrafeService的命名示例,但试图解析IService的命名示例。
我猜第一个是从第二个派生出来的,所以应该是这样的:

string name = request.GetRegisteredService().ToString();
IService anagServ = IoC.Container.Resolve<IAnagrafeService>(name);

(Or当然,您可以更改Unity注册。)

ni65a41a

ni65a41a2#

我不认为这与未注册的服务有关。这通常会抛出此Exception:
当前类型IFoo是接口,无法构造.是否缺少类型Map?
这可能是锁定的结果。您可以尝试以下模式:

public static class IocContainer
{
    private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() =>
    {
        var container = new UnityContainer();

        // Do your registrations.
        container.RegisterType<IService, EstattoriService>(RegisteredServices.Estrattori.ToString());
        container.RegisterType<IService, StandardService>(RegisteredServices.Anagrafica.ToString());
        container.RegisterType<IService, PrivacyService>(RegisteredServices.Privacy.ToString()); 
        container.RegisterType<IService, ListAnagService>(RegisteredServices.ListaAnagrafica.ToString()); 

        return container;
    });

    public static IUnityContainer Instance
    {
        get { return Container.Value; }
    }
}

如果这不是一个选项,您可以尝试不锁定容器本身:

internal class IoC{
  private static IUnityContainer container = new UnityContainer();
  private static bool isInitialized = false;
  private static readonly object padlock = new object(); // lock object.

public static IUnityContainer Container
{
    get
    {
        if (!isInitialized)
        {
            lock (padlock) // Lock on padlock instead.
            {
                if (!isInitialized)

                    container.RegisterType<IService, EstattoriService>(RegisteredServices.Estrattori.ToString());
                    container.RegisterType<IService, StandardService>(RegisteredServices.Anagrafica.ToString());
                    container.RegisterType<IService, PrivacyService>(RegisteredServices.Privacy.ToString()); 
                    container.RegisterType<IService, ListAnagService>(RegisteredServices.ListaAnagrafica.ToString()); 
                                isInitialized = true;

                }
            }
        }
        return container;
    }
}

我发现这是单例模式的一个很好的源代码。
http://csharpindepth.com/Articles/General/Singleton.aspx

相关问题