1

這裏是我的不完整StructureMap配置:DI與asp.net MVC/Linq2Sql組合的StructureMap配置?

PS:大的道歉要求你寫我的應用程序爲我,但我發現了StructureMap API是一個有點混亂,因爲幾乎所有我發現,當我進行Google搜索指到更老的api。

public static void Configure(IContainer container) 
    { 
     container.Configure(c => 
     { 
      string connectionString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString; 
      SQLDataContext dataContext = new SQLDataContext(connectionString); 

      c.For<SQLDataContext>().HttpContextScoped(); 

      c.For<IAdminRepository>().Use<SQLAdminRepository_v2>().Ctor<SQLDataContext>().Is(dataContext); 
      c.For<IMemberRepository>().Use<SQLMemberRepository_v2>().Ctor<SQLDataContext>().Is(dataContext); 
      c.For<IUtilityRepository>().Use<SQLUtilityRepository_v2>().Ctor<SQLDataContext>().Is(dataContext); 

      c.For<IAdminService>().Use<AdminService_v2>(); 
      c.For<IMemberService>().Use<MemberService_v2>(); 
      c.For<IUtilityService>().Use<UtilityService_v2>(); 

      c.For<ResourcePool>().Singleton(); 

     }); 
    } 

每個服務都依賴於通過其構造函數傳入的相應Repository。例如:

public class ContactService_v2 : IContactService 
{ 
    IContactRepository contactRepository; 

    public ContactService_v2(IContactRepository contactRepository) 
    { 
     this.contactRepository = contactRepository; 
    } 

    public IQueryable<Contact> Get_Contacts() 
    { 
     return contactRepository.GetContacts(); 
    } 

    public void Save_Contact(Contact contact) 
    { 
     contactRepository.Save_Contact(contact); 
    } 
} 

所以服務層只是門面,真正的Repository位於它的後面。 [在你提出或建議之前 - 不,我不會急着改變它,因爲最初我只是想讓DI開始工作,在我開始做任何戲劇性事情之前讓代碼可測試。]

Q1:應用程序使用Linq2Sql數據訪問。發送給每個控制器的所有服務都必須在其存儲庫依賴項中依賴於相同的數據上下文實例,因爲它們可能需要通過存儲庫中進行的複雜查詢彼此連接。因此,我想爲數據上下文使用HttpContext生命週期。這(上面)是如何做到的?

Q2:ResourcePool用於遵循單例模式,但我已將它重構爲一個普通類,它將一個服務作爲其構造參數。是對的嗎?在這種情況下,它會表現得好像它來自於asp.net應用程序緩存嗎?

問題3:存儲庫和服務配置的自動註冊等效項是什麼? [PS:是的,我知道「_v2」後綴是非常規的,但是已經存在每個XService和XRepository的舊版等價物,我希望在添加DI並且無縫工作之後,在我的閒暇時重構它。

Asp.Net MVC允許一個有很強的模型,像這樣綁定:

[HttpPost] 
public ActionResult List(AdminDisplay admin) 
{ 
    admin.GetAdminPage(); 
    return View(admin); 
} 

在每一個類(如AdminDisplay)需要一個默認參數的構造函數,這樣的MVC框架可以創建這樣的情況。此外,在這樣的模型綁定類中創建的任何類也都需要這樣的無參數構造函數。

問題4:如果我想替換這些無參數構造函數,只需在StructurMap配置代碼中添加它們的條目就足夠了嗎? - 或者我不需要這樣做,只要所有這些模型綁定類及其依賴項都具有隻使用StructureMap能夠解析的參數的構造函數。

上面的格式不好的道歉,但我怎麼關閉wysiwyg編輯?

PS:允許回答問題Q1,Q2,Q3,Q4中的任何一個,但不回答所有問題!

+2

歡迎來到Stack Overflow。如果你問幾個簡短的問題,而不是一個長問題和許多子問題,你更有可能得到答案。另外,如果可以回答任何(但不是全部)問題,那麼你將如何選擇並接受答案? – 2012-03-01 13:05:49

+0

感謝馬克, 正如上面最後一個PS中指出的 - 單獨回答這些問題是可以接受的。 – user1040323 2012-03-02 16:02:53

+0

我對此有點擔心,因爲我認爲它已經破產 - 但它是我的新回購層中的東西,而不是破產! 上面的代碼工作。唷。 主要區別在於我將在調用實例之前設置數據上下文的生存期,如下所示: 'code' c.For ()。HttpContextScoped(); SQLDataContext dataContext = new SQLDataContext(connectionString); 'code' – user1040323 2012-03-02 16:34:24

回答

1

Q1:

SQLDataContext dataContext = new SQLDataContext(connectionString); 
c.For<SQLDataContext>().HttpContextScoped(); 

到:

c.For<SQLDataContext>().HybridHttpOrThreadLocalScoped() 
.Use(() => new SQLDataContext(connectionString)); 

改變代碼從爲每個庫:

c.For<IAdminRepository>().Use<SQLAdminRepository_v2>() 
.Ctor<SQLDataContext>().Is(dataContext); 

到: 更改從代碼的數據上下文

c.For<IAdminRepository>().Use<SQLAdminRepository_v2>() 
.Ctor<SQLDataContext>();