2013-10-09 72 views
1

我在C#4.5项目中使用Ninject作为IoC容器。我正在尝试使用Ninject注入一个抽象工厂模式,该模式在MVC中正常工作,但不在Web Api中。Ninject在MVC和WebAPI中创建抽象工厂

我有以下的安装:

Ninject 3.0.1.10 
Ninject.Extensions.WCF 3.0.0.5 
Ninject.MVC3 3.0.0.6 
Ninject.Web.Common 3.0.0.7 
SignalR.Ninject 

我的工厂类是这样的:

public interface IBusinessEngineFactory 
{ 
    T GetBusinessEngine<T>() where T : IBusinessEngine; 
} 

public interface IBusinessEngine 
{ 
} 

public class BusinessEngineFactory : IBusinessEngineFactory 
{ 

    private IKernel Kernel { get; set; } 

    public BusinessEngineFactory(IKernel kernel) 
    { 
     Kernel = kernel; 
    } 

    T IBusinessEngineFactory.GetBusinessEngine<T>() 
    { 
     return Kernel.Get<T>(); 
    } 
} 

我有标准NinjectWebCommon:

公共静态类NinjectWebCommon { 私有静态readonly Bootstrapper bootstrapper = new Bootstrapper();

/// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     RegisterServices(kernel); 
     // Install our Ninject-based IDependencyResolver into the Web API config 
     GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel); 
     return kernel; 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IUserIdentity>().To<UserIdentity>(); 
     kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); 
     kernel.Bind<IAlarmEngine>().To<AlarmEngine>(); 
     kernel.Bind<IBusinessEngineFactory>().To<BusinessEngineFactory>(); 
    }   
} 

这是在控制器从而

public class UserController : BaseController 
{ 

    public UserController(IBusinessEngineFactory businessEngineFactory, IUnitOfWork unitOfWork, UserIdentity userIdentity) 
     : base(businessEngineFactory, unitOfWork, userIdentity) 
    { 

    } 

... 

    public ActionResult Edit(int id = 0) 
    { 
... 
     var x = BusinessEngineFactory.GetBusinessEngine<IAlarmEngine>(); 
     x.ProcessAlarmEventUpdate("test"); 

     return View(x); 
    } 
} 

工作正常设置。在那里我有一个问题是在WebAPIController相同代码:

public class AlarmWebApiController : ApiController 
{ 

    public IBusinessEngineFactory BusinessEngineFactory { get; set; } 

    public IUnitOfWork UnitOfWork {get; set;} 

    public IUserIdentity UserIdentity { get; set; } 

    public AlarmWebApiController(IBusinessEngineFactory businessEngineFactory, IUnitOfWork unitOfWork, IUserIdentity userIdentity) 
    { 
     if (businessEngineFactory == null) throw new NullReferenceException("businessEngineFactory"); 
     BusinessEngineFactory = businessEngineFactory; 
     if (unitOfWork == null) throw new NullReferenceException("unitOfWork"); 
     UnitOfWork = unitOfWork; 
     if (userIdentity == null) throw new NullReferenceException("userIdentity"); 
     UserIdentity = userIdentity; 
    } 

} 

当我运行这个MVC控制器处理罚款,但在Web API功能不,我得到它在构造函数中的任何代码之前发生了令人费解的错误信息的webapi被称为。

“错误加载Ninject组件ICACHE

没有组件已注册在内核中的组件容器”

我认为这个问题是说MVC具有内核的知识,但由于的WebAPI使用此:

GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel); 

所以它不知道内核。创建业务引擎的代码存在于主MVC,Web API和ninject创建的不同项目中,如果可以的话,我宁愿不要将依赖关系粘贴到System.Web.Http(对于GlobalConfiguration.Configuration.DependencyResolver对象)帮助它。有什么办法可以跨MVC和WebAPI工作吗?

在此先感谢

回答

0

我解决了这个问题,因此国际奥委会将注入抽象工厂,并在这两个MVC和的WebAPI返回正确的具体实施。在结束我的解决方案有以下软件包:

<package id="Ninject" version="3.0.1.10" targetFramework="net40" /> 
<package id="Ninject.Extensions.Wcf" version="3.0.0.5" targetFramework="net40" /> 
<package id="Ninject.MVC3" version="3.0.0.6" targetFramework="net40" /> 
<package id="Ninject.Web.Common" version="3.0.0.7" targetFramework="net40" /> 
<package id="Ninject.Web.WebApi-RC" version="3.0.0.22" targetFramework="net45" /> 

业务引擎工厂进行了修改,使用以下命令:

public class BusinessEngineFactory : IBusinessEngineFactory 
{ 

    private IResolutionRoot resolutionRoot { get; set; } 

    public BusinessEngineFactory(IResolutionRoot resolutionRoot) 
    { 
     this.resolutionRoot = resolutionRoot; 
    } 

    T IBusinessEngineFactory.GetBusinessEngine<T>() 
    { 
     return this.resolutionRoot.Get<T>(); 
    } 
} 

我试图用包Ninject.Web.WebApi里面也没有工作和Ninject.Web.WeApi.Updated,它阻止我的解决方案在应用程序启动时出现“调用目标抛出异常”错误消息。回到旧版本是解决方案,所以现在一切工作正常。我甚至检查过它在WCF中工作!