gpt4 book ai didi

.net - 帮助 Windsor 和存储库以及工作单元模式

转载 作者:行者123 更新时间:2023-12-04 17:56:52 24 4
gpt4 key购买 nike

我有这些接口(interface):

public interface IUnitOfWork
{
IPersonRepository People { get; }
IBookRepository Books { get; }
int Commit();
}

public interface IBookRepository
{
Book GetBookById(int id);
IQueryable<Book> GetAllBooks();
}

public interface IPersonRepository
{
Person GetPersonById(int id);
IQueryable<Person> GetAllPeople();
}

我实现 IUnitOfWork如下:
public class SqlUnitOfWork : IUnitOfWork
{
private readonly DbContext dbContext;

public SqlUnitOfWork()
{
dbContext = new DbContext("name=SQLContainer");
}

public IPersonRepository People
{
get { return IoC.Container.Resolve<IPersonRepository>(new { DbContext = dbContext }); }
}

public IBookRepository Books
{
get { return IoC.Container.Resolve<IBookRepository>(new { DbContext = dbContext }); }
}

public int Commit()
{
return dbContext.SaveChanges();
}
}
IBookRepository 的实现和 IPersonRepository使用带有 DbContext 的构造函数作为参数,这个 DbContext 是在 SqlUnitOfWork(上面的代码)中创建的,我使用 Resolve 方法的重载传递这个参数。

我的问题是,这是正确的做法吗?这是一个好习惯吗?

谢谢!

最佳答案

使用 DI 容器作为 Service Locator can hardly be said to be good practice .除此之外,通过 DbContext解析接口(interface)时到容器是 泄漏抽象 因为这意味着你知道一些你不应该知道的具体实现。

相反,我会推荐 构造函数注入(inject) ,这将是这样的:

public class SqlUnitOfWork : IUnitOfWork
{
private readonly DbContext dbContext;
private readonly IPersonRepository personRepository;
private readonly IBookRepository bookRepository;

public SqlUnitOfWork(DbContext dbContext,
IPersonRepository personRepository, IBookRepository bookRepository)
{
if (dbContext == null)
throw new ArgumentNullException("dbContext");
if (personRepository == null)
throw new ArgumentNullException("personRepository");
if (bookRepository = null)
throw new ArgumentNullException("bookRepository");

this.dbContext = dbContext;
this.personRepository = personRepository;
this.bookRepository = bookRepository;
}

public IPersonRepository People
{
get { return this.personRepository; }
}

public IBookRepository Books
{
get { return this.bookRepository; }
}

public int Commit()
{
return this.dbContext.SaveChanges();
}
}

即使没有明确共享 DbContext ,这个可以通过容器来配置。由于这个问题的上下文表明 CaSTLe Windsor 是正在使用的容器,因此默认生命周期已经是 Singleton,因此您不必显式设置它。与温莎城堡, DbContext将自动在 SqlUnitOfWork 之间共享类和两个存储库。

但是,您也可以显式配置要共享的上下文,如下所示:
container.Register(Component.For<DbContext>().LifeStyle.Singleton);

如果你使用另一个 DI Container,API 会有所不同,但概念是一样的。

额外信息:我不知道整体上下文是什么,但如果这是用于 Web 应用程序和 DbContext是 Entity Framework 或 LINQ to SQL 上下文,正确的生命周期配置将改为 PerWebRequest,因为这些上下文类都不是线程安全的:
container.Register(Component.For<DbContext>().LifeStyle.PerWebRequest);

关于.net - 帮助 Windsor 和存储库以及工作单元模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6935297/

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