我使用nuget模板的方式来注入我的MVC3应用程序,这意味着我必须使用WebActivator来调用静态类上的方法,该方法反过来创建一个MVC3引导程序并连接到Ninject。
这对于控制器、适配器等很好用,但我想要有另一个Webactivator激活的类,它使用Ninject获取依赖项。
我让它与穷人的解决方案一起工作,但我更喜欢更优雅的解决方案。
首先,我要确保我的Webactivator类使用了PostApplicationStartMethod invoke,因为PreApplicationStartMethod模块使用了Ninject,所以我可以确保ninject已经装入并且可以运行了。在THen方法中我这样做
var workers = DependencyResolver.Current.GetServices<IWorker>();要获取依赖项,整个类如下所示
[assembly: WebActivator.PostApplicationStartMethod(typeof(SHB.DALA.Web.App_Start.WorkflowRunner), "Start")]
namespace SHB.DALA.Web.App_Start
{
public static class WorkflowRunner
{
public static void Start()
{
var workers = DependencyResolver.Current.GetServices<IWorker>();
//Do stuff with worker collection
}
}
}一定有一个更优雅的解决方案,对吧?
发布于 2011-10-27 14:30:19
WebActivator (实际上是ASP.NET)没有任何关于Ninject项目的知识,因此不能注入任何参数。你需要一个WebActivator扩展(就像你有一个MVC扩展一样)来实现它。但坦率地说,这有点进退两难:你想让WebActivator在设置WebActivator的同时设置Ninject。
我可以为你想出两种可能的场景:
WorkflowRunner类。它是一个很好的小类,没有任何其他代码依赖它,你可以通过一个DependencyResolver来获得你的引用,它将你的工作流初始化很好地封装在那里。我没有察觉到任何问题,在另一个WebActivator类中设置你的工作流。你知道你的对象已经初始化了,你仍然可以把工作流初始化代码放在一个单独的类中。如果我是你,我显然会选择1。
发布于 2011-10-26 21:13:17
如果你已经有了Ninject引导程序,你确定你需要另一个解决方案吗?对于非控制器依赖项,我使用具有GetInstance()方法的BindingFactory类。这只是调用Kernel对象上的Get()方法。
public class BindingFactory
{
private static readonly IKernel Kernel = new StandardKernel(new DefaultServices());
public static T GetInstance<T>()
{
return Kernel.Get<T>();
}
public static IController GetControllerInstance(Type controllerType)
{
return Kernel.Get(controllerType) as IController;
}
}然后,我使用了一个利用BindingFactory的NinjectControllerFactory。
public class NinjectControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext context, Type controllerType)
{
if (controllerType == null)
return null;
return BindingFactory.GetControllerInstance(controllerType);
}
}所以我认为你可以调整你当前的实现。
https://stackoverflow.com/questions/7902925
复制相似问题