gpt4 book ai didi

c# - 以一种方法创建 EF4 上下文

转载 作者:行者123 更新时间:2023-11-30 12:15:37 26 4
gpt4 key购买 nike

我有很多这样的方法:

    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???

最佳答案

您描述的实际问题是您不知道如何设置 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;
}

当然,综上所述,我不知道这种重定向/抽象级别是否有用 - 您正在使它稍微复杂一些,但几乎没有可察觉的 yield (如果有的话)。除非有大量的工作来设置和拆除 dbContext用于 InDb我认为这不是很有帮助。

关于c# - 以一种方法创建 EF4 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7066493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com