2

我在ASP.NET MVC應用程序上使用StructureMap與實體框架和IRepository/IUnitOfWork模式。我們的目標是讓所有的對象限制在當前的HTTP請求,如下所示:StructureMap,實體框架和IRepository/IUnitOfWork配置

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的命名實例,其內部IObjectContexts不同樣的例子,這不是我的意圖。

關於我在做什麼錯的任何想法?非常感激任何的幫助!

回答

0

StructureMap支持兩種形式的依賴注入:

  1. 構造器注入 - 通過構造函數參數 「推」 的依賴項的具體類。
  2. 安裝員注入 - 通過公共屬性將「依賴」推送到具體類中。 「Setter」術語取自 Java,其中屬性爲getSomething()和setSomething(value)。

    // 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<>)); 
    

    這或多或少是我如何做到這一點,每次:

我一直在使用類似如下的配置有很大的成績。

讓我知道它是否適合你。 此致 最大