gpt4 book ai didi

asp.net-mvc-3 - 如何将 Entity Framework 上下文与依赖注入(inject)一起使用?

转载 作者:行者123 更新时间:2023-12-04 18:22:03 25 4
gpt4 key购买 nike

我正在尝试设置一个可以使用 Entity Framework edmx 模型上下文的基本存储库类。我遇到的问题是我需要找到 EF EDMX 对象上下文实现的接口(interface),以便我可以通过依赖注入(inject)传递给构造函数。我之前通过使用创建它并将其存储在 HttpContext 中的 DataFactory 解决了这个问题,但这会扼杀单元测试的能力。任何帮助,将不胜感激。谢谢!

public abstract class BaseRepository<T> where T : EntityObject
{
private MyDataModelContext _dataContext;
private ObjectSet<T> dbset;

protected BaseRepository(IObjectContext dataContext)
{
_dataContext = dataContext;
dbset = _dataContext.CreateObjectSet<T>();
}

.....

最佳答案

我总是创建一个 DataContextFactory ,它将我自己的接口(interface)传递给上下文,并将其传递给我的存储库,如下所示:

上下文接口(interface):

public IMyDataContext {
// One per table in the database
IDbSet<Class1> Class1s { get;set; }
// etc

// The standard methods from EF you'll use
void Add( object Entity );
void Attach( object Entity );
void Delete( object Entity );
void SaveChanges();
}

上下文工厂:
public class MyDataContextFactory : IMyDataContextFactory {
public IMyDataContext GetContext() {
// TODO: Use the service locator pattern to avoid the direct instanciation
return new MyDataContext();
}
}

上下文工厂接口(interface):
public interface IMyDataContextFactory {
IMyDataContext GetContext();
}

存储库:
public class MyClass1Repository {
private readonly IMyDataContextFactory factory;
public MyClass1Repository( IMyDataContextFactory Factory ) {
// TODO: check for null
this.factory = Factory;
}
public List<MyClass1> GetAll() {
using ( IMyDataContext db = this.factory.GetContext() ) {
return db.Class1s.ToList();
}
}
// TODO: Other methods that get stuff
}

然后当我想测试存储库时,我传入了一个假的 IMyDataContextFactory返回一个假的 IMyDataContext来自 GetContext() .

我及时注意到存储库中的重复,并且可以将某些方法推送到基本存储库中: GetAll() , Save() , GetById()有时如果我有一致的主键等。

关于asp.net-mvc-3 - 如何将 Entity Framework 上下文与依赖注入(inject)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464388/

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