[英]Ninject.ActivationException was unhandled by user code
最近兩天我一直在解決這個問題,我想做的是防止創建DisplayWeatherAstronomy實例,我以為它是在昨晚借助Tadmas在另一個線程上解決的,但是我遇到了Ninject的問題。
因此,我修改了代碼,並使用接口將類轉換為抽象類,但是Ninject仍然遇到問題,即使錯誤看起來很容易解釋,我也不知道如何解決它。
我的錯誤是:
Ninject.ActivationException was unhandled by user code
HResult=-2146233088
Message=Error activating IDisplayWeatherAstronomy using binding from IDisplayWeatherAstronomy to GetWeatherAstronomyData
No constructor was available to create an instance of the implementation type.
Activation path:
2) Injection of dependency IDisplayWeatherAstronomy into parameter igwa of constructor of type WeatherController
1) Request for WeatherController
Suggestions:
1) Ensure that the implementation type has a public constructor.
2) If you have implemented the Singleton pattern, use a binding with InSingletonScope() instead.
Source=Ninject
StackTrace:
at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 82
at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157
at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197
at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165
at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114
at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96
at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157
at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType) in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectDependencyResolver.cs:line 56
at Castle.Proxies.Invocations.IDependencyResolver_GetService.InvokeMethodOnTarget()
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Glimpse.Core.Extensibility.CastleInvocationToAlternateMethodContextAdapter.Proceed()
at Glimpse.Core.Extensions.AlternateMethodContextExtensions.TryProceedWithTimer(IAlternateMethodContext context, TimerResult& timerResult)
at Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext context)
at Glimpse.Core.Extensibility.AlternateTypeToCastleInterceptorAdapter.Intercept(IInvocation invocation)
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.IDependencyResolverProxy.GetService(Type serviceType)
at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)
InnerException:
碼:
public abstract class GetWeatherAstronomyData : IDisplayWeatherAstronomy
{
public class DisplayWeatherAstronomy
{
public string SunRise { get; internal set; }
public string SunSet { get; internal set; }
public string MoonRise { get; internal set; }
public string MoonSet { get; internal set; }
}
public IEnumerable<DisplayWeatherAstronomy> WeatherAstronomy(string id)
{
var doc = WeatherForcast.WeatherLocationSearchXmlDataAsync(id);
var result = XDocument.Parse(doc.Result);
var displayAstronomy = (from wd in result.Descendants("astronomy")
select new DisplayWeatherAstronomy
{
SunRise = (string)wd.Element("sunrise") ?? string.Empty,
SunSet = (string)wd.Element("sunset") ?? string.Empty
});
return displayAstronomy;
}
}
接口
public interface IDisplayWeatherAstronomy
{
IEnumerable<GetWeatherAstronomyData.DisplayWeatherAstronomy> WeatherAstronomy(string id);
}
Ninject
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IDisplayWeatherAstronomy>()
.To<GetWeatherAstronomyData>()
.InSingletonScope();
}
最終控制人
private readonly IDisplayWeatherAstronomy _igwa;
public WeatherController(IDisplayWeatherAstronomy igwa)
{
_igwa = igwa;
}
最終解決此問題的任何幫助將不勝感激
喬治
您不能實例化一個抽象類。 Ninject也不能做到這一點。 從GetWeatherAstronomyData
刪除abstract
修飾符。
如果要防止其他人實例化您的類,請將其與接口一起放入“額外”項目/程序集B中,並使其internal
,而不是public
(也不是abstract
!)。 該接口必須是public
。
然后還將ninject模塊添加到同一程序集,這將創建綁定:
public class WeatherModule : NinjectModule
{
this.Bind<IDisplayWeatherAstronomy>().To<DisplayWeatherAstronomy>();
}
然后,在原始項目中,添加對項目/程序集B的引用並加載WeatherModule
:
kernel.Load<WeatherModule>();
而已。
但是請記住,仍然任何人都可以使用創建類
IResolutionRoot.Get<IDisplayWeatherAstronomy>();
因此,只有在可以限制對內核的訪問的情況下,您才有收獲,而這通常是不切實際的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.