来自外部程序集的Ninject 2 + ASP.NET MVC 2绑定类型

时间:2010-04-09 22:08:41

标签: asp.net-mvc ninject ninject-2

我只是试着开始使用Ninject 2和ASP.NET MVC 2.我已经按照本教程http://www.craftyfella.com/2010/02/creating-aspnet-mvc-2-controller.html创建了一个带有Ninject的Controller Factory,并将第一个抽象绑定到具体的实现。现在我想从另一个程序集(我的具体SQL存储库所在的位置)加载存储库类型,我只是不能让它工作。这是我的代码:

的Global.asax.cs

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);


        ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
    }

控制器工厂:

public class Kernelhelper
{
    public static IKernel GetTheKernel()
    {
        IKernel kernel = new StandardKernel();
        kernel.Load(System.Reflection.Assembly.Load("MyAssembly"));
        return kernel;
    }
}

public class MyControllerFactory : DefaultControllerFactory
{
    private IKernel kernel = Kernelhelper.GetTheKernel();


    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {

        return controllerType == null ? null : (IController)kernel.Get(controllerType);
    }
}

在“MyAssembly”中有一个模块:

    public class ExampleConfigModule : NinjectModule
{
    public override void Load()
    {
        Bind<Domain.CommunityUserRepository>().To<SQLCommunityUserRepository>();
    }

}

现在当我在我的入口点插入一个MockRepository对象时,它工作正常,需要存储库的控制器工作正常。 kernel.Load(System.Reflection.Assembly.Load(“MyAssembly”));它也完成了它的工作并注册了模块,但是当我调用需要存储库的控制器时,我从Ninject获得了ActivationException:

没有匹配的绑定可用,并且该类型不可自我绑定。 激活路径:  2)将依赖项CommunityUserRepository注入到AccountController类型的构造函数的参数_rep中  1)对AccountController的请求

任何人都可以给我一个来自外部程序集的绑定类型的最佳实践示例(这实际上是依赖注入的一个重要方面)吗?谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我做了一些重构,现在我开始运行了。我将发布我的Global.asax的代码,因为那是一切发生的地方。我正在使用最新的Ninject 2 Build和最新的Ninject.Web.Mvc Build for MVC 2.

 public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

    }

    protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        RegisterAllControllersIn(System.Reflection.Assembly.GetExecutingAssembly());
    }


    protected override Ninject.IKernel CreateKernel()
    {

        var kernel = new StandardKernel();
        kernel.Load(new ExampleConfigModule());
        return kernel;
    }
}

public class ExampleConfigModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        string connectionString =
            ConfigurationManager.ConnectionStrings
            ["ConnectionString1"].ConnectionString;
        string communityUserRepTypeName =
           ConfigurationManager.AppSettings
           ["CommunityUserRepositoryType"];
        var communityUserRepositoryType =
            Type.GetType(communityUserRepTypeName, true);
        Bind<Domain.CommunityUserRepository>().To(communityUserRepositoryType).WithConstructorArgument("conString",connectionString);
    }

}

正如你所看到的,我摆脱了我的ControllerFactory,继承自NinjectHttpApplication和load&amp;在模块中绑定外部程序集的类型。现在可能有一种更好的方法,如果没有在配置文件中指定类型作为字符串,也许你可以在外部程序集中声明模块并让Ninject从那里自动加载它但我仍然需要将连接字符串传递给具体实现的构造函数。也许有人对此有所了解,但现在一切正常。