JcM*_*Dev 19 asp.net-mvc ninject ioc-container
请原谅我的无知,但我对IOC和NinJect很新.我已经搜索了高低的易于理解的解决方案,但到目前为止他们已经找不到我了.
到目前为止,我有以下所有工作正如预期:
private class StandardModule : NinjectModule
{
public override void Load()
{
Bind<ILog>().To<NLogLogger>(); // Use NLog
Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,MyEntityFrameWorkRepository通过app/web.config中声明的连接字符串创建自己的EF DbContext:
public class MyDbContext : DbContext
{
public MyDbContext() : base("MyAppConfig")
{
}
........
}
Run Code Online (Sandbox Code Playgroud)
然而!!我的目标是这样的 - 我意识到这种语法是"胡说八道"(我想我也可能需要IOC MyDbConext),但我希望"伪代码"传达我的愿望:
private class StandardModule : NinjectModule
{
public override void Load()
{
Bind<ILog>().To<NLogLogger>(); // Use NLog
string mySqlConnectionString = MyApp.GetCommandLineArgument("sqlconn"); // "Data Source=..."
Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>(mySqlConnectionString);
}
}
.................
public class MyDbContext : DbContext
{
public MyDbContext( string sqlConnectionString) :
base(sqlConnectionString) // will accept a standard SQL connection string
{
}
........
}
Run Code Online (Sandbox Code Playgroud)
我真的很感谢来自IOC/NinJect专家的一些反馈,因为我确信任何"模式"在其他场景中都非常有用.
mry*_*ren 23
您可以使用该.WithConstructorArgument()方法指定构造函数参数.第一个参数应该是构造函数参数的名称.
public class StandardModule : NinjectModule
{
public override void Load()
{
string connectionString = "...";
Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>()
.WithConstructorArgument("sqlConnectionString", connectionString);
}
Run Code Online (Sandbox Code Playgroud)
}
较新版本的Ninject允许摆脱绑定定义中的魔术字符串.像这样的东西:
public class StandardModule : NinjectModule
{
public override void Load()
{
string connectionString = "...";
Bind<IMyEntityFrameWorkRepository()
.ToConstructor(_ => new MyEntityFrameWorkRepository(connectionString);
}
}
Run Code Online (Sandbox Code Playgroud)
对于涉及的通用类型(例如绑定的绑定ISomeService<T>到SomeService<T>并结合应为所有可能类型的一次执行),ToConstructor不能使用(需要新的表达),所以WithConstructorArgument仍然是最简单的方法.例如:
Bind(typeof(ISomeService<>))
.To(typeof(SomeService<>))
.WithConstructorArgument("someParam", "someValue");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13758 次 |
| 最近记录: |