只要我为使用泛型的界面设置规则,就很难使用。例如,这适用于(对于简单的界面)
// 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!
);
我找不到相同的东西,有什么可以吗?
答案 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);