我正在尝试使用Simple Injector创建我的存储库并在业务逻辑层中使用它(我也想使用PerWebRequest方法)。
在DAL层我有:
public interface IRepository<T> where T : class
{
void Add(T entity);
void Delete(T entity);
void Delete(int id);
void Update(T entity);
T GetById(int Id);
IQueryable<T> All();
IEnumerable<T> Find(Func<T, bool> predicate);
}
和:
public class EFRepository<T> : IRepository<T>, IDisposable where T : class
{
#region Members
protected DbContext Context { get; set; }
protected DbSet<T> DbSet { get; set; }
#endregion
#region Constructors
public EFRepository(DbContext dbContext)
{
if (dbContext == null)
throw new ArgumentNullException("dbContext");
Context = dbContext;
DbSet = Context.Set<T>();
}
和我的背景:
public class PASContext : DbContext, IDbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<User> Users { get; set; }
public PASContext()
: base("PostAndSell")
{ }
}
正如您所看到的,EFRepository
只有一个带有一个参数的构造函数 - 这是因为我想使用Simple Injector创建上下文的实例,并在创建时将其传递给存储库。
在BLL中我有一个类ProductBLL
,我希望从数据库中获取该类中的所有产品(使用一些GetAll方法)并传递它,比如说HomeController。
我真的需要有人跟我说说。
我首先从nuger安装正确的软件包(Simple Injector和Simple Injector ASP.NET Integration)
也在我的global.asax.cs文件中,{I}添加了Application_Start()
函数:
var container = new SimpleInjector.Container();
container.RegisterPerWebRequest<IRepository<Product>, EFRepository<Product>>();
但是我在哪里创建Context实例?以及如何在业务层中访问它?
答案 0 :(得分:16)
由于您可能会有许多IReposotory<T>
实施(针对产品,客户,员工等),因此最好为IRepository<T>
进行单一的开放式通用注册,如下所示:
container.Register(typeof(IRepository<>), typeof(EFRepository<>), Lifestyle.Scoped);
将范围生活方式定义为:
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
此注册确保Simple Injector每次请求EFRepository<Product>
时都会返回IRepository<Product>
,EFRepository<Customer>
会IRepository<Customer>
,依此类推,等等。
由于您希望在同一请求中的所有存储库上使用相同的DbContext
实例,因此您还应该使用范围生活方式注册DbContext
:
container.Register<DbContext, PASContext>(Lifestyle.Scoped);
在BLL中,我有一个ProductBLL类,我想获得所有产品 从数据库中传递给它,让我们说HomeController
在那种场景中,这个ProductBLL
对我来说似乎是一种无用的抽象。如果只是传递数据,您可以轻松地让HomeController
直接依赖IRepository<Product>
。