Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 结构图、实体框架和IRepository/IUnitOfWork配置_Asp.net_Dependency Injection_Inversion Of Control_Structuremap - Fatal编程技术网

Asp.net 结构图、实体框架和IRepository/IUnitOfWork配置

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")

我正在ASP.NET MVC应用程序上使用带有实体框架和IRepository/IUnitOfWork模式的StructureMap。目标是将所有对象的作用域限定为当前HTTP请求,如下所示:

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<>));
每次我都或多或少是这样做的

让我知道它是否适合你。 真诚地 马克斯