2011-08-09 73 views
1

我有一个接口,称为IRepository,有两种实现方式:StructureMap配置帮助

  • SqlRepository

  • SqlDualWriterRepository

第一个实现是一个普通的SQL持久性实现了对象它的类型为T.它依赖于SqlConnectionStringProvider的一个实例(它提供了一个连接字符串,顾名思义nd将构造函数参数作为连接字符串名称)。

二是内部使用2 SQLRepository依赖另一种实现方式:

public class SqlDualWriterRepository<T> : IRepository<T> 
{ 
    private readonly IRepository<T> _primaryRepository; 
    private readonly IRepository<T> _secondaryRepository; 

    public SqlDualWriterRepository(
     IRepository<T> primaryRepository, 
     IRepository<T> secondaryRepository) 
    { 
     _primaryRepository = primaryRepository; 
     _secondaryRepository = secondaryRepository; 
    } 

}

我想实现的是配置StructureMap,这样要求的IRepository实例时,它会:

  1. 将IRepository解析为SqlDualWriterRepository的实例
  2. 解析两个内库键入SqlRepository
  3. 在步骤2中实例化两个SqlRepository对象,我需要解决以不同的方式SqlConnectionStringProvider(在构造函数中提供不同的字符串参数)

我不知道如何做到这一点。 有没有办法做到这一点与属性或其他类型的配置?

我正在使用StructureMap 2.6.2.0。

回答

1

我发现了两个解决方案:

  1. 使用Lambda告诉StructureMap如何建立,将解决IRepository依赖关系SqlDualWriterRepository实例:

    x.For<IRepository<Type>>().Use(
         ()=> new SqlDualWriterRepository<Type>(
          NewPrimaryRepositoryInstance<Type>(), 
          NewSecondaryRepositoryInstance<Type>())); 
    
  2. 使用.Ctor <>()来明确指定实例化每个构造函数依赖项的内容:

    x.For<IRepository<Type>>().Use<SqlDualWriterRepository<Type>>() 
         .Ctor<IRepository<Type>>("primaryRepository").Is(NewPrimaryRepositoryInstance<Type>()) 
         .Ctor<IRepository<Type>>("secondaryRepository").Is(NewSecondaryRepositoryInstance<Type>()); 
    

在上述两个示例中,NewPrimaryRepositoryInstance()和NewSecondaryRepositoryInstance()方法都使用适当的SqlConnectionStringProvider配置创建主要和辅助SqlRepositories。

有可能有更好的方法来实现这一点,但这些解决方案现在做。