【发布时间】:2016-04-18 04:38:36
【问题描述】:
我有一个代表第 3 方 API 中的表的接口。每个实例都提供了使用只进游标搜索单个表的能力:
public interface ITable
{
string TableName { get; }
ICursor Search(string whereClause);
}
我编写了一个包装类来处理搜索 ITable 并返回一个可枚举(它比现实中的要复杂一些,但足以显示我的问题):
public interface ITableWrapper
{
IEnumerable<object> Search(string whereClause);
}
public class TableWrapper : ITableWrapper
{
private ITable _table;
public TableWrapper(ITable table)
{
_table = table;
}
public IEnumerable<Row> Search(string whereClause)
{
var cursor = _table.Search(whereClause);
while(cursor.Next())
{
yield return cursor.Row;
}
}
}
然后我有几个存储库类应该注入一个表包装器:
public class Table1Repository
{
private ITableWrapper _table;
public Table1Reposiroty(ITableWrapper table)
{
_table = table;
}
//repository methods to actually do things
}
由于每个表都有自己的包装器,并且存储库需要正确的表注入,我的想法是在表和包装器上使用命名绑定,以便 ninject 提供正确的实例。因此,上面的类会将 NamedAttribute 应用于构造函数参数,并且绑定如下:
public void NinjectConfig(IKernel kernel, ITableProvider provider)
{
Bind<ITable>().ToMethod(ctx => provider.OpenTable("Table1")).Named("Table1").InSingletonScope();
Bind<ITableWrapper>().ToMethod(ctx => new TableWrapper(ctx.ContextPreservingGet<ITable>("Table1"))).Named("Table1Wrapper").InSingletonScope();
}
我的问题是:
- 有没有更简洁的方式来表达这种绑定?我在想也许一种方法可以绑定 ITableWrapper 并为每个命名的 ITable 返回一个新实例,并使用存储库构造函数参数属性选择它想要 ITableWrapper 的命名 ITable。
- 如果 ITable 不应该被任何东西使用,并且所有东西都应该始终使用 ITableWrapper,那么是否可以(甚至推荐)只绑定 ITableWrapper 并结合 ToMethod 内容:
public void NinjectConfig(IKernel kernel, ITableProvider provider)
{
Bind<ITableWrapper>().ToMethod(ctx => new TableWrapper(provider.OpenTable("Table1"))).Named("Table1Wrapper").InSingletonScope();
}
【问题讨论】: