结构映射到 Ninject
本文关键字:Ninject 映射 结构 | 更新日期: 2023-09-27 17:56:10
我需要将StructureMap代码转换为Ninject(以支持我的托管服务提供商,因为他们只支持在中等信任下运行的应用程序)。我在结构图中的基本寄存器是:
ObjectFactory.Initialize(x =>
{
x.For<IDbConnection>()
.HttpContextScoped()
.Use(() =>
{
var constr = ConfigurationManager
.ConnectionStrings["conn"].ConnectionString;
var conn = new SqlConnection(constr);
conn.Open();
return conn;
});
x.FillAllPropertiesOfType<IDbConnection>();
x.For<ICurrent>().Use<Current>();
x.For<ILogger>().Use<Logger>();
x.For<IMembershipService>().Use<SpaceMembership>();
x.For<IFormsAuthenticationService>()
.Use<FormsAuthenticationService>();
x.Scan(sc =>
{
sc.Assembly("Space360.DB");
sc.AddAllTypesOf(typeof(IRepository<>));
sc.WithDefaultConventions();
});
});
它看起来类似于这样:
// IDbConnection binding
Bind<IDbConnection>().ToMethod(x => {
var constr = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
var conn = new SqlConnection(constr);
conn.Open();
return conn;})
.InRequestScope();
// ommited fill all properties of type
Bind<ICurrent>().To<Current>(); // .InRequestScope() - just suggestion
Bind<ILogger>().To<Logger>();
Bind<IMembershipService>().To<SpaceMembership>();
Bind<IFormsAuthenticationService>().To<FormsAuthenticationService>();
// for this: Ninject.Extensions.Conventions has to be referenced
Bind(x=> x.From("Space360.DB")
.SelectAllClasses().InheritedFrom<IRepository>()
.BindDefaultInterface()
// .Configure(b => b.InRequestScope())
);
恐怕目前没有类似于 Ninject 中FillAllPropertiesOfType
方法的内置版本。您必须使用 [Inject]
属性标记所有依赖属性(但它会将您的类绑定到 Ninject.Core
),或者您可以尝试本文中描述的方法:
Ninject 3.0 属性注入,不带 [注入] 属性
基本上,它创建了Ninject组件,IInjectionHeuristic
的实现,它连接到ninject内核,因此它知道如何解释启发式。ShouldInject
方法中的注射规则是:
- 该属性是 Ninject 生成的类上的公共可写属性
- 它位于我们个人关心的组件中
- 可以解决
对于我示例中的最后一行,您需要使用 ninject.extensions.conventions
请注意,还有ninject.extensions.logging用于记录器的隐式注入(目前支持Log4Net和NLog)。