لماذا لا يتم تجميع ninjectmvc3.cs من nupack؟ (أو ماذا حدث لـ MVCServicElocator في ASP.NET MVC 3 BETA؟)
-
28-09-2019 - |
سؤال
باستخدام Addin Nupack وتثبيت حزمة Ninject MVC 3 في خطأ الترجمة التالي في المنشأة التي تم إنشاؤها NinjectMVC3.cs
ملف.
The name 'MvcServiceLocator' does not exist in the current context
ال عينة الفيديو ديفيد ebbo المنشور يظهر ذلك العمل بشكل جيد في الساعة 09:43.
هنا الفئة التي تم إنشاؤها حاليًا:
public class NinjectMVC3 {
public static void RegisterServices(IKernel kernel) {
//kernel.Bind<IThingRepository>().To<SqlThingRepository>();
}
public static void SetupDependencyInjection() {
// Create Ninject DI Kernel
IKernel kernel = new StandardKernel();
// Register services with our Ninject DI Container
RegisterServices(kernel);
// Tell ASP.NET MVC 3 to use our Ninject DI Container
MvcServiceLocator.SetCurrent(new NinjectServiceLocator(kernel));
}
}
المحلول
أساسًا، MvcServiceLocator
ذهب بعيدا. كلما تم صنع الفيديو ، كان هناك عدم تطابق في الإصدارات ، على ما أعتقد.
هناك تفسيرات ممتازة متاحة هنا و هنا.
الخطوتين اللذين سيجعلان عمل تسعة على النحو التالي. يحل محل NinjectMVC3
مع ما يلي (قمت أيضًا بتغيير الاسم الذي ليس ضروريًا):
public class NinjectResolver : IDependencyResolver
{
private static IKernel kernel;
public NinjectResolver()
{
kernel = new StandardKernel();
RegisterServices(kernel);
}
public static void RegisterServices(IKernel kernel)
{
//kernel.Bind<IThingRepository>().To<SqlThingRepository>();
}
public object GetService(Type serviceType)
{
return kernel.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.GetAll(serviceType);
}
}
وأضف السطر التالي إلى App_Start()
في gloabl.asax.cs
DependencyResolver.SetResolver(new NinjectResolver());
نصائح أخرى
لقد أصلحت الحزمة وحملتها على الخلاصة. سيكون من الرائع أن تتاح لك فرصة تجربتها والتحقق من أنها تعمل الآن. لقد رفعت نسخة ninject.mvc3 من 0.1 إلى 0.2 :)
لقد قمت للتو بتثبيت ninject.mvc3 0.3. أنا أستخدم ASP.NET MVC 3 BETA.
لقد أضفت هذا الرمز إلى بلدي Global.asax.cs
ملف:
public static void RegisterServices(IKernel kernel)
{
kernel.Bind<IProductRepository>().To<SqlProductRepository>();
}
public void SetupDependencyInjection()
{
IKernel kernel = new StandardKernel();
RegisterServices(kernel);
DependencyResolver.SetResolver(new Ninject.Mvc3.NinjectServiceLocator(kernel));
}
وقد أضفت مكالمة إلى SetupDependencyInjection()
داخل Application_Start()
وظيفة لذلك يبدو هكذا:
protected void Application_Start()
{
SetupDependencyInjection();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
ال IProductRepository
و SqlProductRepository
هي الفصول التي صنعتها في مجلد النماذج الخاص بي وأضفت تبعية مُنشئ إلى بلدي HomeController
. هذا هو الرمز:
private IProductRepository products;
public HomeController(IProductRepository productRepository)
{
products = productRepository;
}
لقد أضفت بعض نقاط التوقف وقمت بتشغيل التطبيق ويعمل مثل السحر. أتمنى أن يساعدك هذا.