20

私は MVC を初めて使用します。「PRO ASP.NET MVC 4 by Adam Freeman」に従っています。現在、その第6章に取り組んでいます。依存性注入のためにMVC 4でNinjectを使用する方法を学んでいます。本に書かれているとおりにアプリケーションを作成しました。次のエラーが発生する理由がわかりません。

この型は microsoft.practices.servicelocation.iservicelocator を実装していないようです

ここに私のコントローラコードがあります:

public class HomeController : Controller
{
    private Product[] products = {
        new Product {Name = "Kayak", Category = "Watersports", Price = 275M},
        new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M},
        new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M},
        new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M}
    };
    private IValueCalculator calc;
    public HomeController(IValueCalculator calcParam)
    {
        calc = calcParam;
    }
    public ActionResult Index()
    {
        ShoppingCart cart = new ShoppingCart(calc) { Products = products };
        decimal totalvalue = cart.CalculateProductTotal();
        return View(totalvalue);
    }
}

以下のように「NinjectDependencyResolver」という名前のクラスを作成しました。

public class NinjectDependencyResolver : DependencyResolver
{
    private IKernel kernal;

    public NinjectDependencyResolver()
    {
        kernal = new StandardKernel();
        AddBindings();
    }


    public object GetService(Type serviceType)
    {
        return kernal.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernal.GetAll(serviceType);
    }

    private void AddBindings()
    {
        kernal.Bind<IValueCalculator>().To<LinqValueCalculator>();
    }
}

以下のようにグローバルファイルを変更しました。

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        DependencyResolver.SetResolver( new NinjectDependencyResolver());
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

「DependencyResolver.SetResolver( new NinjectDependencyResolver());」について この行のエラーが発生しています:

he type EssentialTools.Infrastructure.NinjectDependencyResolver does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator.

パラメータ名: commonServiceLocator

どうすればこのエラーを解決できますか。

前もって感謝します。

4

4 に答える 4

17

1年後、同じ問題に遭遇しました...pdbの回答のおかげで、回避策を見つけることができました。カスタマイズされたSystem.Web.Mvc.IDependencyResolver代わりに強制すると、コードの他の部分で. たとえば、カスタマイズされた DI を一般化しようとすると、次のようになります。System.Web.Http.Dependencies.IDependencyResolverNinjectDependencyResolverSystem.Web.Http.Dependencies.IDependencyResolver

GlobalConfiguration.Configuration.DependencyResolver =
    new NinjectDependencyResolver(kernel)

私の場合、両方を実装したところ、次のIDependencyResolverように機能しました。

public class NinjectDependencyResolver
    : NinjectDependencyScope
    , IDependencyResolver
    , System.Web.Mvc.IDependencyResolver
于 2014-07-10T23:27:40.167 に答える
16

問題はNinjectDependencyResolver、インターフェイスを実装していないが、クラスIDependencyResolverから継承していることです。DependencyResolverDependencyResolver実装されていないためIDependencyResolver、独自のメソッドが MVC の認識とは無関係になります。

次のように変更します。

public class NinjectDependencyResolver : IDependencyResolver

しかし、Ufuk Hacıoğulları が言うように、公式の Ninject.MVC3 NuGet パッケージを使用して、Ninject と MVC を統合できます。このパッケージは Ninject の開発者によって作成され、Ninject コア ライブラリに依存しています。

于 2013-08-28T11:39:13.650 に答える