我有一个基于DbContext的类,它由EF设计器自动生成(目前使用Database First)。 DbContext在其自己的程序集中称为“模型”。
public partial class MyContext : DbContext {}
我还有另一个部分类中的代码并实现了一个接口:
public interface IMyContext
{
int Commit();
Task<int> CommitAsync(CancellationToken ct);
}
public partial class MyContext : IMyContext {}
我还有一个工作单元和通用存储库。这些类位于另一个名为“DAL”
的分离器程序集中public interface IUnitOfWork<TContext> : IDisposable where TContext : IMyContext
{
int Commit();
Task<int> CommitAsync(CancellationToken ct);
}
public interface IRepository<T> where T : class {}
public abstract class Repository<TContext, T> : IRepository<T> where TContext : IMyContext where T : class, IEntity
最后我有我的服务,这是另一个名为'服务'的程序集。
public class LoginService : BaseService, ILoginService
{
public LoginService(ILogService logService,
IUnitOfWork<IMyContext> unitOfWork)
: base(logService, unitOfWork)
{ }
}
我需要使用Autofac注册IMyContext:
builder.RegisterType(typeof(MyContext))
.As(typeof(IMyContext))
.InstancePerRequest();
但是如果我进行上述注册,我会收到DbContext未知的错误。这是因为我没有(并且不希望/不需要)在我的WebApi项目中引用实体框架
我是否仍然可以注册上述界面而无需参考EF?有哪些替代方案?
答案 0 :(得分:0)
似乎错误是因为MyContext也没有注册为DbContext。
另一种方法是,您可以创建一个位于DAL程序集内的Autofac module,并负责与MyContext
相关的注册。 WebApi项目中的Autofac注册现在包括注册模块而不是注册各个类型。
这意味着您需要在DAL程序集中引用Autofac。另外,我并不完全熟悉Autofac的更新版本,因此我不确定您是否会遇到尝试在Web项目之外注册InstancePerRequest范围的问题。 / p>