Проблема MVC3, Ninject и Ninject.MVC3 - PullRequest
1 голос
/ 09 июля 2011

Я только начал использовать Ninject с MVC3, поэтому вот моя проблема: - Я установил Ninject 2.2.1.4 и Ninject.MVC3 2.2.2.0 из Nuget - В моем WebUI (проект MVC3):

Global.asax.cs

public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    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 = UrlParameter.Optional } // Parameter defaults
        );

    }

    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();

        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

    protected override IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }


}
  • В моем домене (проект класса) у меня есть текст данных LinQ to SQL, я хочу загрузить контекст со строкой соединения измой Web.Config в моем WebUI, поэтому мне нужно передать параметр конструктора, у меня также есть некоторые службы в моем проекте домена

    public class LotteryDataService
    {
        LinQ.WebDataContext _context;
    
        public LotteryDataService(LinQ.WebDataContext context)
        {
            _context = context;
        }
    
        public IEnumerable<LinQ.LotteryData> Get()
        {
            return _context.LotteryDatas.Take(10);
        }
    }
    

Как связать текст данных с помощью Ninject с помощью конструкторапараметр (здесь строка подключения)?

Ответы [ 2 ]

3 голосов
/ 09 июля 2011

Так вы передаете параметр конструктора.Ninject разрешит конструктор, который соответствует указанным аргументам конструктора.

public class DataModule : NinjectModule
{
    public override void Load()
    {
        string connectionString = "...";
        Bind<WebDataContext>().ToSelf()
            .WithConstructorArgument("connection", connectionString);
    }
}

Первый аргумент .WithConstructorArgument() должен быть именем параметра конструктора.Это fileOrServerOrConnection в базовом классе, но connection в производном классе.

0 голосов
/ 09 декабря 2011

Ниже может быть полезна привязка кода. Надеюсь, это послужит большей гибкости!

public class MvcModule : NinjectModule
{
    //Bind the default connection string
    public void BindDataContext()
    {
        ConstructorArgument parameter = new ConstructorArgument("connectionString", "[Config Value]");
        Bind<DataContext>().ToSelf().InRequestScope().WithParameter(parameter);
    }
    public override void Load()
    {
         BindDataContext();
         Bind(typeof(IRepository<>)).To(typeof(EntityRepository<>)).InRequestScope();
         ........
    }
    //Re-Bind the connection string (in case of multi-tenant architecture)
    public void ReBindDataContext(string cn)
    {
         ConstructorArgument parameter = new ConstructorArgument("connectionString", cn);
         Rebind<DataContext>().ToSelf().InRequestScope().WithParameter(parameter);
    }
    //Re-Bind the connection string (in case of multi-tenant architecture)
    public static void ReBindDataContext(IKernal kernel,string cn)
    {
         IEnumerable<INinjectModule> ml = kernel.GetModules();
         var myModule = ml.Where(i => i.Name.ToLowerInvariant().Contains("mvcmodule")).Select(i => i).Take(1);
         MvcModule mm = myModule.ToList()[0] as MvcModule ;
         mm.ReBindDataContext(cn);
    }
    //Return the module, for further modification like connection string
    public static MvcModule GetModule(IKernal kernel)
    {
        IEnumerable<INinjectModule> ml = kernel.GetModules();
        var myModule = ml.Where(i => i.Name.ToLowerInvariant().Contains("mvcmodule")).Select(i => i).Take(1);
        MvcModule mm = myModule.ToList()[0] as MvcModule ;
        return mm;
    }
}
...