我使用LINQ Zip()
方法创建Dictionary<TAbstraction,TImplementation>
,以便在DI容器中注册所有类型。
TAbstraction是暴露的类型,其名称以汇编中的 Repository 结尾,而TImplementation是抽象的实现(名称以 Repository 结尾)位于另一个集会。
到目前为止,我已经按IEnumerable
订购了两个Type.Name
,并且可以执行注册但非常脆弱。
我保留了以约定命名的程序集中的类型(抽象必须被称为[objectname]Repository
,而实现Sql[objectname]Repository
)。
结果列表按字母顺序排序,因此如果我添加一个名为I[objectname]Repository
的界面(或者更有可能,如果我之后的开发人员会这样做),列表顺序将会搞砸。
字典是这样创建的:
var dictionary = repositories.Zip(repositoriesImp, (r, rImp) => new { r, rImp })
.ToDictionary(x => x.r, x => x.rImp);
我想在Zip()
方法中或之后引入 where 子句,以避免意外错误,例如
var dictionary = (from r in repositories
join rImp in repositoriesImp
on //?
where rImp.Name.Contains(r.Name)
select new{
Key = r,
Value = rImp
}).ToDictionary(x=>x.Key,x=>x.Value);
从MSDN我看到代理Func<TFirst, TSecond, TResult>
你可以执行某些操作(他们使用三元运算符),所以我想知道你是否可以检查{ {1}}从那里开始。
答案 0 :(得分:0)
var dictionary = repositories.Join(repositoriesImp,
x => x.Name,
y => y.Name,
(x, y) => new { Key = x, Value = y))
.ToDictionary(a => a.Key , a => a.Value );
答案 1 :(得分:0)
这是我的方法错了。我使用反射以正确的方式创建我的字典:
var repositoriesImp = typeof(SqlDataRepository).Assembly.GetExportedTypes()
.Where(t => t.Name.EndsWith("Repository"))
.ToList();
var dictionary = new Dictionary<Type, Type>();
foreach (var repositoryImp in repositoriesImp)
{
var repository = typeof(DataRepository).Assembly.GetExportedTypes()
.Where(t => repositoryImp.IsSubclassOf(t))
.Single();
dictionary.Add(repository, repositoryImp);
}
感谢大家指出我正确的方向。