小编Kar*_*arl的帖子

如何在AutoFac中注册单独程序集中的服务和类型?

我正在尝试使用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中实现此目的的最佳方法吗?如果我的一些服务来自抽象类怎么办?

dependency-injection ioc-container autofac

5
推荐指数
1
解决办法
5246
查看次数

包含Generic方法的通用接口需要相同的约束吗?

我定义了以下接口.

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)

c# generics entity-framework

1
推荐指数
1
解决办法
3983
查看次数