为使用泛型的接口设置构造函数参数

时间:2014-03-12 14:11:36

标签: c# generics dependency-injection structuremap

只要我为使用泛型的界面设置规则,就很难使用。例如,这适用于(对于简单的界面)

           // Imagine this interface
           public interface ISearchProvider.

           // Easy to set up with constructor parameters
            x.For<ISearchProvider>()
                .HybridHttpOrThreadLocalScoped()
                .Use<CatalogueSearchProvider>()
                .Ctor<bool>( "recreateDb" ).Is( false )
                .Ctor<string>("connectionString").Is( catalogConnString );

与此比较:

// Now this interface (that use generics)
public interface IRepo<T> :  IRepo<T> where T : IEntity

如果我想使用相同的设置,我必须使用&#34; typeof&#34;和不同的结构图方法,缺乏设置构造函数参数的可能性。

            x.For(typeof(IRepo<>))
                .HybridHttpOrThreadLocalScoped()
                .Use(typeof(MyRepo<>)
                .Ctor  <-- doesn't exist!
                );

我找不到相同的东西,有什么可以吗?

2 个答案:

答案 0 :(得分:0)

不是将原始类型注入泛型类型的构造函数,而是将此信息提取到单独的(非泛型)抽象中。通过这种方式,您甚至可以防止在第一时间使用脆弱的.Ctor方法调用。

例如:

public class MyRepo<T> : IRepo<T> {
    private readonly IConnectionFactory connectionFactory;
    public MyRepo(IConnectionFactory connectionFactory) {
        this.connectionFactory = connectionFactory;
    }
}

使用以下配置:

x.For(typeof(IConnectionFactory))
    .Singleton()
    .Use(new ConnectionFactory(false, catalogConnString));

x.For(typeof(IRepo<>))
    .HybridHttpOrThreadLocalScoped()
    .Use(typeof(MyRepo<>));

问题解决了: - )

PS。请注意Per Thread Lifestyle is Considered Harmful。你应该使用范围生活方式。

答案 1 :(得分:0)

它实际上几乎相同,只是方法调用在非泛型调用中被命名为不同。我仔细检查了它,它适用于开放式泛型。

因此,对于您的示例,您将拥有:

x.For(typeof(IRepo<>))
            .HybridHttpOrThreadLocalScoped()
            .Use(typeof(MyRepo<>)
            .CtorDependency<bool>("recreateDb").Is(false)
            .CtorDependency<string>("connectionString").Is(catalogConnString);
相关问题