2012-11-17 4 views
4

У меня есть очень простой Ninject связывания:параметр Pass для метода связывания

Bind<ISessionFactory>().ToMethod(x => 
    { 
     return Fluently.Configure() 
      .Database(SQLiteConfiguration.Standard 
       .UsingFile(CreateOrGetDataFile("somefile.db")).AdoNetBatchSize(128)) 
      .Mappings( 
       m => m.FluentMappings.AddFromAssembly(Assembly.Load("Sauron.Core")) 
         .Conventions.Add(PrimaryKey.Name.Is(p => "Id"), ForeignKey.EndsWith("Id"))) 
      .BuildSessionFactory(); 
    }).InSingletonScope(); 

Что мне нужно заменить «somefile.db» с аргументом. Нечто похожее на

kernel.Get<ISessionFactory>("somefile.db"); 

Как это достичь?

ответ

2

Вы можете предоставить дополнительные IParameter сек при вызове Get<T>, так что вы можете зарегистрировать свое имя дб, как это:

kernel.Get<ISessionFactory>(new Parameter("dbName", "somefile.db", false); 

Затем вы можете получить доступ к предоставленной коллекции Parameters через IContext (sysntax является небольшим подробным):

kernel.Bind<ISessionFactory>().ToMethod(x => 
{ 
    var parameter = x.Parameters.SingleOrDefault(p => p.Name == "dbName"); 
    var dbName = "someDefault.db"; 
    if (parameter != null) 
    { 
     dbName = (string) parameter.GetValue(x, x.Request.Target); 
    } 
    return Fluently.Configure() 
     .Database(SQLiteConfiguration.Standard 
      .UsingFile(CreateOrGetDataFile(dbName))) 
      //... 
     .BuildSessionFactory(); 
}).InSingletonScope(); 
+0

@nemsev большое спасибо :) – Davita

0

Теперь, когда это NinjectModule, мы можем использовать NinjectModule.Kernel свойство:

Bind<ISessionFactory>().ToMethod(x => 
    { 
     return Fluently.Configure() 
      .Database(SQLiteConfiguration.Standard 
       .UsingFile(CreateOrGetDataFile(Kernel.Get("somefile.db"))).AdoNetBatchSize(128)) 
      .Mappings( 
       m => m.FluentMappings.AddFromAssembly(Assembly.Load("Sauron.Core")) 
         .Conventions.Add(PrimaryKey.Name.Is(p => "Id"), ForeignKey.EndsWith("Id"))) 
      .BuildSessionFactory(); 
    }).InSingletonScope(); 
+0

Нет, это производный класс NinjectModule ... – Davita

+0

NinjectModule имеет общедоступное свойство Kernel, которое вы можете использовать. – deerchao

+0

спасибо за вашу помощь, но я думаю, что я действительно не понимаю, что вы имеете в виду. Как бы Kernel.Get («что-то») помог бы мне достичь того, чего я хочу. Не могли бы вы дать мне фрагмент, как создать фрагмент ISessionFactory, передающий «somefile.db» в качестве параметра? – Davita