首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象转换为Webactivator调用的类

对象转换为Webactivator调用的类
EN

Stack Overflow用户
提问于 2011-10-26 20:58:56
回答 2查看 1.6K关注 0票数 2

我使用nuget模板的方式来注入我的MVC3应用程序,这意味着我必须使用WebActivator来调用静态类上的方法,该方法反过来创建一个MVC3引导程序并连接到Ninject。

这对于控制器、适配器等很好用,但我想要有另一个Webactivator激活的类,它使用Ninject获取依赖项。

我让它与穷人的解决方案一起工作,但我更喜欢更优雅的解决方案。

首先,我要确保我的Webactivator类使用了PostApplicationStartMethod invoke,因为PreApplicationStartMethod模块使用了Ninject,所以我可以确保ninject已经装入并且可以运行了。在THen方法中我这样做

代码语言:javascript
复制
var workers = DependencyResolver.Current.GetServices<IWorker>();

要获取依赖项,整个类如下所示

代码语言:javascript
复制
[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
        }
    }
}

一定有一个更优雅的解决方案,对吧?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-27 14:30:19

WebActivator (实际上是ASP.NET)没有任何关于Ninject项目的知识,因此不能注入任何参数。你需要一个WebActivator扩展(就像你有一个MVC扩展一样)来实现它。但坦率地说,这有点进退两难:你想让WebActivator在设置WebActivator的同时设置Ninject。

我可以为你想出两种可能的场景:

  1. 让代码保持原样--老实说,我不知道你为什么不喜欢你的WorkflowRunner类。它是一个很好的小类,没有任何其他代码依赖它,你可以通过一个DependencyResolver来获得你的引用,它将你的工作流初始化很好地封装在那里。我没有察觉到任何问题,在另一个WebActivator类中设置你的工作流。你知道你的对象已经初始化了,你仍然可以把工作流初始化代码放在一个单独的类中。

如果我是你,我显然会选择1。

票数 3
EN

Stack Overflow用户

发布于 2011-10-26 21:13:17

如果你已经有了Ninject引导程序,你确定你需要另一个解决方案吗?对于非控制器依赖项,我使用具有GetInstance()方法的BindingFactory类。这只是调用Kernel对象上的Get()方法。

代码语言:javascript
复制
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。

代码语言:javascript
复制
public class NinjectControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext context, Type controllerType)
    {
        if (controllerType == null)
            return null;

        return BindingFactory.GetControllerInstance(controllerType);
    }
}

所以我认为你可以调整你当前的实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7902925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档