与Asp.Net MVC和放大器配置Ninject;网页API [英] Configuring Ninject with Asp.Net MVC & Web Api

查看:145
本文介绍了与Asp.Net MVC和放大器配置Ninject;网页API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的设置与项目Ninject国际奥委会

我的项目有普通的 Asp.Net MVC 控制器和网​​页API 控制器。现在, Ninject 适用于网​​页API ,但 Ninject 没有按'与常规 Asp.MVC 控制器将不起作用。


我的常规MVC控制器执行;

 公共类GalleryController:BaseController
{
    公共GalleryController(IUow UOW)
    {
        UOW = UOW;
    }
    ........
}

与常规控制器使用时

错误

 试图创建类型的控制器时发生错误Web.Controllers.HomeController。确保控制器具有一个无参数公共构造函数。]

然而,当我尝试在同一code。与网络的API,它的工作原理

 公共类GalleryController:BaseApiController
{
    公共GalleryController(IUow UOW)
    {
        UOW = UOW;
    }
    ......
}

我的界面,拥有不同的资源库(工厂模式)

 公共接口IUow
{
    //保存未决更改数据存储。
    无效提交();    // Repositoryries
    IRepository<画廊>画廊{搞定; }
    IMenuRepository菜单{搞定; }
}

NinjectDependencyScope 类;

 公共类NinjectDependencyScope:IDependencyScope
{
    私人IResolutionRoot解析器;    内部NinjectDependencyScope(IResolutionRoot解析器)
    {
        Contract.Assert(解析!= NULL);        this.resolver =解析器;
    }    公共无效的Dispose()
    {
        VAR一次性=解析为IDisposable的;
        如果(一次性!= NULL)
            disposable.Dispose();        解析器= NULL;
    }    公共对象GetService的(类型的serviceType)
    {
        如果(解析器== NULL)
            抛出新的ObjectDisposedException(本,这个范围已被释放);        返回resolver.TryGet(的serviceType);
    }    公共IEnumerable的<对象> GetServices(类型的serviceType)
    {
        如果(解析器== NULL)
            抛出新的ObjectDisposedException(本,这个范围已被释放);        返回resolver.GetAll(的serviceType);
    }
}

NinjectDependencyResolver 类;

 公共类NinjectDependencyResolver:NinjectDependencyScope,的IDependencyResolver
{
    私人的iKernel内核;    公共NinjectDependencyResolver(内核的iKernel)
        :基地(内核)
    {
        this.kernel =内核;
    }    公共IDependencyScope BeginScope()
    {
        返回新NinjectDependencyScope(kernel.BeginBlock());
    }
}

为Global.asax中

Ninject 配置;

 公共类IocConfig
{
    公共静态无效RegisterIoc(HttpConfiguration配置)
    {
        VAR内核=新StandardKernel(); // Ninject国际奥委会
        //kernel.Load(Assembly.GetExecutingAssembly()); //只需要在asp.net的MVC(非的WebAPI)
        //这些注册是每个实例的请求。
        //见http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/        kernel.Bind&所述; RepositoryFactories方式>()到< RepositoryFactories>()
            .InSingletonScope();        kernel.Bind&所述; IRepositoryProvider方式>()到< RepositoryProvider>();
        kernel.Bind&所述; IUow方式>()到< UOW>();        //告诉的WebAPI如何使用我们的Ninject的IoC
        config.DependencyResolver =新NinjectDependencyResolver(内核);
    }
}

Global.asax中

 保护无效的Application_Start()
{    //告诉的WebAPI使用我们自定义的IOC(Ninject)
    IocConfig.RegisterIoc(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);    GlobalConfig.CustomizeConfig(GlobalConfiguration.Configuration);
    AreaRegistration.RegisterAllAreas();
}


解决方案

很多搜索后,原来有,我们不能被web API和定期MVC使用Ninject。我的意思是,我们必须separatly配置存储库。

所以,我当时有一个很好的文章,其中介绍了如何使用Ninject用asp.net mvc的&安培;网页API。
<一href=\"http://www.$c$cproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc4-and-webapi-us\">http://www.$c$cproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc4-and-webapi-us


而现在,我不明白的错误,它的工作:D

更新1:


也可以尝试<一个href=\"http://blogs.msdn.com/b/kirpas/archive/2013/08/06/writing-a-simple-implementation-of-dependency-injection-in-mvc-4-web-api-with-net-framework-4-5.aspx\">Writing一个简单的实现依赖注入的MVC 4的Web API使用.NET框架4.5

i have setup my project with Ninject IoC.
My project has regular Asp.Net MVC controllers and Web Api controllers. Now, Ninject works with Web Api but Ninject doesn't work with regular Asp.MVC controllers.
My regular MVC controller implementation;

public class GalleryController : BaseController
{
    public GalleryController(IUow uow)
    {
        Uow = uow;
    }
    ........
}

Error when using with regular controller

An error occurred when trying to create a controller of type 'Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]

However, when i try the same code with Web Api, it works

public class GalleryController : BaseApiController
{
    public GalleryController(IUow uow)
    {
        Uow = uow;
    }
    ......
}

my interface which holds difference repositories (the factory pattern)

public interface IUow
{
    // Save pending changes to the data store.
    void Commit();

    //Repositoryries
    IRepository<Gallery> Gallery { get; }
    IMenuRepository Menus { get; }
}

NinjectDependencyScope class;

public class NinjectDependencyScope : IDependencyScope
{
    private IResolutionRoot resolver;

    internal NinjectDependencyScope(IResolutionRoot resolver)
    {
        Contract.Assert(resolver != null);

        this.resolver = resolver;
    }

    public void Dispose()
    {
        var disposable = resolver as IDisposable;
        if (disposable != null)
            disposable.Dispose();

        resolver = null;
    }

    public object GetService(Type serviceType)
    {
        if (resolver == null)
            throw new ObjectDisposedException("this", "This scope has already been disposed");

        return resolver.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        if (resolver == null)
            throw new ObjectDisposedException("this", "This scope has already been disposed");

        return resolver.GetAll(serviceType);
    }
}

NinjectDependencyResolver class;

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
{
    private IKernel kernel;

    public NinjectDependencyResolver(IKernel kernel)
        : base(kernel)
    {
        this.kernel = kernel;
    }

    public IDependencyScope BeginScope()
    {
        return new NinjectDependencyScope(kernel.BeginBlock());
    }
}

Ninject configuration for Global.asax;

public class IocConfig
{
    public static void RegisterIoc(HttpConfiguration config)
    {
        var kernel = new StandardKernel(); // Ninject IoC
        //kernel.Load(Assembly.GetExecutingAssembly()); //only required for asp.net mvc (not for webapi)
        // These registrations are "per instance request".
        // See http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

        kernel.Bind<RepositoryFactories>().To<RepositoryFactories>()
            .InSingletonScope();

        kernel.Bind<IRepositoryProvider>().To<RepositoryProvider>();
        kernel.Bind<IUow>().To<Uow>();

        // Tell WebApi how to use our Ninject IoC
        config.DependencyResolver = new NinjectDependencyResolver(kernel);
    }
}

Global.asax

protected void Application_Start()
{

    // Tell WebApi to use our custom Ioc (Ninject)
    IocConfig.RegisterIoc(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    GlobalConfig.CustomizeConfig(GlobalConfiguration.Configuration);
    AreaRegistration.RegisterAllAreas();
}

解决方案

After searching alot, it turns out there we can't use Ninject with web api and regular mvc. I mean, we have to configure the Repositories separatly.
so, i then got a nice article which explains how you can use Ninject with asp.net mvc & web api. http://www.codeproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc4-and-webapi-us
And now, i don't get the error and it's working :D

Update 1:
Also try Writing a simple implementation of dependency injection in MVC 4 Web API with .NET Framework 4.5

这篇关于与Asp.Net MVC和放大器配置Ninject;网页API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆