我需要将StructureMap代码转换为Ninject(以支持我的托管服务提供商,因为它们仅支持在中等信任下运行的应用程序)。 我在StructureMap中的基本寄存器是:
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();
});
});
答案 0 :(得分:0)
它看起来与此相似:
// 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 Property Injection Without [Inject] Attribute
基本上它创建了Ninject组件,实现了IInjectionHeuristic
,它连接到ninject内核,因此它知道如何解释启发式。 ShouldInject
方法中的注射规则是:
对于我示例中的最后一行,您需要使用ninject.extensions.conventions
注意,还有ninject.extensions.logging隐式注入logger(目前支持Log4Net和NLog)。