我正在尝试使用AutoFac注册我的"服务".这些服务基于约定(Aggregate Root +'Service')命名,所有实现的接口都具有相同的名称:'I'+ ServiceName.例如,OrderService工具IOrderService.
但是,具体类型和接口都在单独的程序集中.到目前为止,我有以下代码:
builder.RegisterAssemblyTypes(typeof(OrderService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces();
Run Code Online (Sandbox Code Playgroud)
这是在AutoFac中实现此目的的最佳方法吗?如果我的一些服务来自抽象类怎么办?
我定义了以下接口.
IDbContext
public interface IDbContext<T> : IDisposable where T : class
{
DbSet<T> Set<T>();
int SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
这是由TestContext间接实现的,请注意TestContext派生自System.Data.Entity.DbContext.
public class TestContext: DbContext,IDbContext<Foo>
{
}
Run Code Online (Sandbox Code Playgroud)
Foo是一个实体
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
编译器抛出以下错误:
类型'T'必须是引用类型才能在泛型类型或方法'System.Data.Entity.DbSet'TestContext.cs中将其用作参数'TEntity'
类型'T'必须是引用类型才能在泛型类型或方法'System.Data.Entity.DbSet'IDbContext.cs中将其用作参数'TEntity'
方法'System.Data.Entity.DbContext.Set()'的类型参数'TEntity'的约束必须与接口方法'Domain.Logic.Repositories.IDbContext.Set()'的类型参数'T'的约束匹配.请考虑使用显式接口实现.
EntityFramework.dll
当我将约束添加到IDbContext接口中的Generic方法时,错误消失了:
public interface IDbContext<T> : IDisposable where T : class
{
DbSet<T> Set<T>() where T : class;
int SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么我需要在类级别定义时明确定义方法的约束?
更新 根据评论我意识到我犯了错误.
我完全忽略了DbContext.Set()方法中的类型参数.泛型方法上的类型参数与其类/接口类型参数(如果有)不同,因此应该命名为不同.在我的情况下,我有几个问题:1)我有一个泛型接口与泛型类型的方法具有相同的参数名称.2)泛型类型方法本身是在DbContext.Set()之后建模的,它有自己的约束,但这些约束没有应用于泛型方法本身.
我按照下面的答案提供了选项3:
public interface IDbContext : IDisposable { …Run Code Online (Sandbox Code Playgroud)