使用Autofac注册接口?

时间:2014-11-19 10:13:51

标签: c# entity-framework asp.net-web-api autofac

我有一个基于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?有哪些替代方案?

1 个答案:

答案 0 :(得分:0)

似乎错误是因为MyContext也没有注册为DbContext。

另一种方法是,您可以创建一个位于DAL程序集内的Autofac module,并负责与MyContext相关的注册。 WebApi项目中的Autofac注册现在包括注册模块而不是注册各个类型。

这意味着您需要在DAL程序集中引用Autofac。另外,我并不完全熟悉Autofac的更新版本,因此我不确定您是否会遇到尝试在Web项目之外注册InstancePerRequest范围的问题。 / p>