Unity+C#-“;依赖关系的解析失败”;
本文关键字:失败 关系 依赖 Unity+C#- | 更新日期: 2024-10-20 17:22:08
我的应用程序有一个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; } }
}
我在执行方法"解决"上有这个例外:
System.Reflection.TargetInvocationException:已发生异常由调用的目标抛出。--->Microsoft.Practices.Unity.ResolutionFailedException:依赖项的解析失败,类型="ApCon.IService",name="Anagxxx"。异常消息为:当前生成操作(生成密钥build key[ApCon.StandardService,Anaxxxx])失败:当前生成操作(生成密钥build key[ApCon.StandardService,Anaxxxx])失败:索引在数组的边界。(策略类型DynamicMethodConstructorStrategy,索引0)(策略类型BuildPlanStrategy,指数3)--->Microsoft.Practices.ObjectBuilder2.BuildFailedException:当前生成操作(生成密钥build key[ApCon.StandardService,Anagrafe])失败:当前生成操作(生成密钥build key[ApCon.StandardService,Anagrafe])失败:索引在数组的边界。(策略类型DynamicMethodConstructorStrategy,索引0)(策略类型BuildPlanStrategy,指数3)--->Microsoft.Practices.ObjectBuilder2.BuildFailedException:当前生成操作(生成密钥生成密钥[ApCon.StandardService,Anagxxx])失败:索引超出了数组的界限。(策略类型DynamicMethodConstructorStrategy,索引0)--->System.IndexOutOfRangeException:索引超出了数组的界限。在System.Collections.Generic.List1.Add(T项)位于Microsoft.Practices.ObjectBuilder2.DependencyResolverTrackerPolicy.AddResolverKey(对象键)Microsoft.Practices.ObjectBuilder2.ConstructorSelectorPolicyBase`1.CreateSelectedConstructor(IBuilderContext上下文,ConstructorInfo ctor)Microsoft.Practices.ObjectBuilder2.ConstructorSelectorPolicyBase1.SelectConstructor(IBuilderContext上下文)Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp(IBuilderContext上下文)Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext上下文)---内部异常堆栈跟踪结束---在
可能是锁定指令吗?类型似乎没有注册,并且isInitialized变成了真正的
据我所知,您正在注册IAnagrafeService
的命名实例,但正在尝试解析IService
的命名实例。
我的猜测是第一个来源于第二个,所以这样的东西应该有效:
string name = request.GetRegisteredService().ToString();
IService anagServ = IoC.Container.Resolve<IAnagrafeService>(name);
(当然,您也可以更改Unity注册。)
我认为这与未注册的服务无关。这通常会引发以下异常:
当前类型IFoo是一个接口,无法构造。是您缺少类型映射吗?
这可能是锁定的结果。你可以试试这个模式:
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;
}
}
我发现这是singleton模式的一个很好的来源。
http://csharpindepth.com/Articles/General/Singleton.aspx