StructureMap配置帮助

时间:2011-08-09 14:31:26

标签: c# c#-4.0 dependency-injection structuremap

我有一个名为IRepository的接口,有两个实现:

  • SqlRepository

  • SqlDualWriterRepository

第一个实现是针对类型为T的对象的常规SQL持久性实现。它依赖于SqlConnectionStringProvider的实例(提供连接字符串,顾名思义并将构造函数参数作为连接字符串名称)。 / p>

第二个是内部使用两个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(在构造函数中提供不同的字符串参数)
  4. 我不知道如何实现这一目标。 有没有办法用属性或其他类型的配置来做?

    我正在使用StructureMap 2.6.2.0。

1 个答案:

答案 0 :(得分:1)

我找到了两个解决方案:

  1. 使用lambda告诉StructureMap如何构建将解决IRepository依赖关系的SqlDualWriterRepository实例:

    x.For<IRepository<Type>>().Use(
            ()=> new SqlDualWriterRepository<Type>(
                NewPrimaryRepositoryInstance<Type>(),
                NewSecondaryRepositoryInstance<Type>()));
    
  2. 使用.Ctor&lt;&gt;()显式指定要为每个构造函数依赖项实例化的内容:

    x.For<IRepository<Type>>().Use<SqlDualWriterRepository<Type>>()
            .Ctor<IRepository<Type>>("primaryRepository").Is(NewPrimaryRepositoryInstance<Type>())
            .Ctor<IRepository<Type>>("secondaryRepository").Is(NewSecondaryRepositoryInstance<Type>());
    
  3. 在上面的两个示例中,NewPrimaryRepositoryInstance()和NewSecondaryRepositoryInstance()方法使用适当的SqlConnectionStringProvider配置创建主SqlRepositories和辅助SqlRepositories。

    可能有更好的方法来实现这一目标,但这些解决方案目前都是这样做的。