为使用泛型的接口设置构造函数参数
本文关键字:设置 构造函数 参数 接口 泛型 | 更新日期: 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);