我正在尝试创建一些“存储库”样式类来包装通过 DapperWrapper 对 Dapper 的调用。尝试将 SqlExecutor 注入存储库,检查属性以确定要连接到哪个数据库。
这是存储库实现,因此您可以看到我要执行的操作:
public class ProviderRepository : IProviderRepository<SearchType>
{
private readonly IDbExecutor executor;
public ProviderRepository([BHN]IDbExecutor executor)
{
this.executor = executor;
}
public IList<SearchType> GetAllSearchTypes()
{
return executor
.Query<SearchType>("BHN.pSEL_LU_SEARCHTYPE_Load", commandType: CommandType.StoredProcedure)
.ToList();
}
}
这是我的 ninject 绑定,我知道它很糟糕,但只是为了说明我正在尝试做的事情:
kernel.Bind<IDbExecutor>().To<SqlExecutor>()
.WhenTargetHas<BHNAttribute>()
.WithConstructorArgument("sqlConnection",
new SqlConnection(connections["ProviderSearch"].ConnectionString));
注意:BHNAttribute 只是一个继承自 Attribute 的空类。
现在显然问题是sql连接是在应用程序启动时创建的,我理解,但是当使用它而不是在应用程序加载时如何进行加载?我一直在玩弄 Ninject Factory 扩展,但我对那个实现的样子感到困惑。所以我创建了这个:
public class ExecutorFactory
{
private ISqlExecutorFactory executor;
public ExecutorFactory(ISqlExecutorFactory executor)
{
this.executor = executor;
}
public void Do()
{
var e = this.executor.CreateSqlExecutor("string");
}
}
public interface ISqlExecutorFactory
{
SqlExecutor CreateSqlExecutor(string conn);
}
我的绑定看起来像这样:
kernel.Bind<ISqlExecutorFactory>.ToFactory();
工厂类中的“字符串”将是“ProviderSearch”,需要传递给我假设的 ToFactory() 方法,但我不明白我将如何做到这一点并结合 BHNAttribute 的使用,就像我之前做的那样. 或者,如果这在这一点上是可能的。
我看错了吗?