我有很多这样的方法:
public IEnumerable<Director> GetAllDirectors()
{
using (var dbContext = new BodModelContainer())
{
return dbContext.Members.OfType<Director>().ToList();
}
}
..或者这个..
public Member GetMemberById(int memberId)
{
using(var dbContext = new BodModelContainer())
{
return dbContext.Members.Find(new[] {memberId});
}
}
或那:
public SomeType GetOrDoSomethingWithDbBySomethingElse(T1 t1var, T2, T2 var, ...)
{
using(var dbContext = new BodModelContainer())
{
return dbContext.SomeType.DoSomething();
}
}
所以我想重新组织所有这些方法,如:
// create db context here
public void InDb(Func<BodModelContainer, out SomeGenericType???> workingWithDb)
{
using(var dbContext = new BodModelContainer())
{
workingWithDb(dbContext);
}
}
// using it like
public Member GetMemberById(int memberId)
{
InDb((dbContext) =>
{
return dbContext.Members.Find(new[] { memberId });
});
}
问题:如何制作此类通用InDb
方法,SomeGenericType???
答案 0 :(得分:3)
您所描述的实际问题是您无法弄清楚如何设置Func<>
的返回类型。为了能够使这个通用,您还需要使InDb
也需要泛型类型。
public TRet InDb<TRet>(Func<BodModelContainer, TRet> workingWithDb) {
TRet ret = default(TRet);
using (var dbContext = new BodModelContainer()) {
ret = workingWithDb(dbContext);
}
return ret;
}
public Member GetMemberById(int memberId) {
return InDb(dbContext => { return dbContext.Members.Find(new[] { memberId }); });
}
应该工作(这里的所有代码都是未经测试的),或者使用匿名方法,你可以拥有一个局部变量,让.Net做所有讨厌的工作。
public void InDb(Action<BodModelContainer> workingWithDb) {
using (var dbContext = new BodModelContainer()) {
workingWithDb(dbContext);
}
}
public Member GetMemberById(int memberId) {
Member member;
InDb(dbContext => { member = dbContext.Members.Find(new[] { memberId }); });
return member;
}
当然,这一切都在说,我不知道这种重定向/抽象级别是否有用 - 你使它稍微复杂一点,几乎没有可感知的增益(如果有的话)。除非有很多工作设置并拆除dbContext
InDb
中使用的{{1}},否则我觉得它不是很有帮助。