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

本文关键字:设置 构造函数 参数 接口 泛型 | 更新日期: 2023-09-27 17:50:02

一旦我为使用泛型的接口设置规则,它就变得难以处理。例如,

           // 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

如果我想使用相同的设置,我必须使用"typeof"和不同的structuremap方法,这些方法缺乏设置构造函数参数的可能性。

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

我找不到相等的,有吗?

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

不要将基本类型注入到泛型类型的构造函数中,而是将这些信息提取到一个单独的(非泛型)抽象中。通过这种方式,您可以避免在一开始就使用脆弱的.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<>));

问题解决:-)

p。请注意,每个线程的生活方式是有害的。您应该使用作用域生活方式。

实际上是一样的,只是方法调用在非泛型调用上的命名不同。我仔细检查了一下,它可以与开放泛型一起工作。

对于你的例子,你可以输入:

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