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