Asp.net 结构图、实体框架和IRepository/IUnitOfWork配置
我正在ASP.NET MVC应用程序上使用带有实体框架和IRepository/IUnitOfWork模式的StructureMap。目标是将所有对象的作用域限定为当前HTTP请求,如下所示:Asp.net 结构图、实体框架和IRepository/IUnitOfWork配置,asp.net,dependency-injection,inversion-of-control,structuremap,Asp.net,Dependency Injection,Inversion Of Control,Structuremap,我正在ASP.NET MVC应用程序上使用带有实体框架和IRepository/IUnitOfWork模式的StructureMap。目标是将所有对象的作用域限定为当前HTTP请求,如下所示: For<ObjectContext>() .HttpContextScoped() .Use<MembershipEntities>() .Ctor<string>("connectionString")
For<ObjectContext>()
.HttpContextScoped()
.Use<MembershipEntities>()
.Ctor<string>("connectionString")
.Is("name=MembershipEntities")
.Named(MembershipObjectContextInstanceKey);
For<IObjectContext>()
.HttpContextScoped()
.Use<ObjectContextAdapter>()
.Ctor<ObjectContext>("objectContext")
.Is(c => c.GetInstance<ObjectContext>(MembershipObjectContextInstanceKey))
.Named(MembershipIObjectContextInstanceKey);
For<IUnitOfWork>()
.HttpContextScoped()
.Use<UnitOfWork>()
.Ctor<IObjectContext>("objectContext")
.Is(x => x.GetInstance<IObjectContext>(MembershipIObjectContextInstanceKey))
.Named(MembershipUOWInstanceKey);
For(typeof(IRepository<>))
.HttpContextScoped()
.Use(typeof(Repository<>))
.CtorDependency<IObjectContext>("objectContext")
.IsNamedInstance(MembershipIObjectContextInstanceKey)
.Named(MembershipIRepositoryInstanceKey);
但是,当我运行此代码并获得IRepository和IUnitOfWork的命名实例时,它们的内部IObjectContext不是同一个实例,这不是我的意图
你知道我做错了什么吗?任何帮助都将不胜感激
StructureMap支持两种形式的依赖项注入:
构造函数注入-通过构造函数参数将依赖项推送到具体类中。
Setter注入-通过公共属性将依赖项推送到具体类中。塞特命名法取自
Java,其中属性为GetSomethingValue和setSomethingvalue。
我使用类似于以下的配置获得了很好的结果:
// In my projects, I have something like a DataContext (IDataContext's implementation) expose my ObjectContext...
// * You don't need to HttpContextScope everything, usually the ObjectContext is sufficient
For<ObjectContext>()
.HttpContextScoped()
.Use<MembershipEntities>()
.Ctor<string>("connectionString")
.Is("name=MembershipEntities")
.Named(MembershipObjectContextInstanceKey);
// Usually, I don't abstract or wrap the ObjectContext, it is simply injected, under the hood
// ObjectContextAdapter receives an ObjectContext (HttpContextScoped)
For<IObjectContext>().Use<ObjectContextAdapter>();
// Ctor receives a IObjectContext
// * Again, if you have absolutely no use for IObjectContext, it shouldn't exist and UnitOfWork's ctor should receive the HttpContextScoped ObjectContext
For<IUnitOfWork>().Use<UnitOfWork>();
// Ctor receives a IObjectContext [...]
For(typeof(IRepository<>)).Use(typeof(Repository<>));
每次我都或多或少是这样做的
让我知道它是否适合你。
真诚地
马克斯
StructureMap支持两种形式的依赖项注入:
构造函数注入-通过构造函数参数将依赖项推送到具体类中。
Setter注入-通过公共属性将依赖项推送到具体类中。塞特命名法取自
Java,其中属性为GetSomethingValue和setSomethingvalue。
我使用类似于以下的配置获得了很好的结果:
// In my projects, I have something like a DataContext (IDataContext's implementation) expose my ObjectContext...
// * You don't need to HttpContextScope everything, usually the ObjectContext is sufficient
For<ObjectContext>()
.HttpContextScoped()
.Use<MembershipEntities>()
.Ctor<string>("connectionString")
.Is("name=MembershipEntities")
.Named(MembershipObjectContextInstanceKey);
// Usually, I don't abstract or wrap the ObjectContext, it is simply injected, under the hood
// ObjectContextAdapter receives an ObjectContext (HttpContextScoped)
For<IObjectContext>().Use<ObjectContextAdapter>();
// Ctor receives a IObjectContext
// * Again, if you have absolutely no use for IObjectContext, it shouldn't exist and UnitOfWork's ctor should receive the HttpContextScoped ObjectContext
For<IUnitOfWork>().Use<UnitOfWork>();
// Ctor receives a IObjectContext [...]
For(typeof(IRepository<>)).Use(typeof(Repository<>));
每次我都或多或少是这样做的
让我知道它是否适合你。
真诚地
马克斯