C# 具有通用接口和组合的简单喷油器-不注册接口

C# 具有通用接口和组合的简单喷油器-不注册接口,c#,asp.net,.net,composition,simple-injector,C#,Asp.net,.net,Composition,Simple Injector,从这里可以看到,我正在从继承转向合成 现在我已经让它全部工作了,但SimpleInjector希望我手动注册每个接口和传入的每个类型。这是条带化的代码 我有IBaseEntityService,它是BaseEntityService实现的,如下所示 public interface IEntityBaseService<T> where T : class, IEntityBase { IDataContext Context { get; } Task<IC

从这里可以看到,我正在从继承转向合成

现在我已经让它全部工作了,但SimpleInjector希望我手动注册每个接口和传入的每个类型。这是条带化的代码

我有IBaseEntityService,它是BaseEntityService实现的,如下所示

public interface IEntityBaseService<T> where T : class, IEntityBase
{
    IDataContext Context { get; }

    Task<ICollection<T>> GetAllAsync();

    Task<T> GetAsync(long id);
}

public class EntityBaseService<T> : IEntityBaseService<T>
    where T : class, IEntityBase
{
    protected IDataContext _context;

    public IDataContext Context
    {
        get
        {
            return _context;
        }
    }

    public EntityBaseService(IDataContext context)
    {
        _context = context;
    }

    public async Task<ICollection<T>> GetAllAsync()
    {
        return await _context.Set<T>().ToListAsync();
    }

    public Task<T> GetAsync(long id)
    {
        return _context.Set<T>().Where(e => e.Id == id).FirstOrDefaultAsync();
    }
}

无论是简单注入器还是代码方面的任何帮助,我们都非常感谢。

您使用了错误的注册方法


RegisterManyForOpenGeneric
的存在是为了支持以下场景:-

container.Register<IValidate<Customer>, CustomerValidator>();
container.Register<IValidate<Employee>, EmployeeValidator>();
container.Register<IValidate<Order>, OrderValidator>();
container.Register<IValidate<Product>, ProductValidator>();

// can replace the above with the following:-
container.RegisterManyForOpenGeneric(
  typeof(IValidate<>),
  typeof(IValidate<>).Assembly);

RegisterManyForOpenGeneric
现在已被标记为过时

container.Register(typeof(IValidator<>), new[] { typeof(IValidator<>).Assembly });
container.Register(typeof(ivalidor),new[]{typeof(ivalidor.Assembly});
现在就要走了

container.Register<IEntityBaseService<Content>, EntityBaseService<Content>>();
container.Register<IValidationService<Content>, ValidationService<Content>>();
container.Register<IValidator<Content>, ContentValidator>();

container.Register<IContentService, ContentService>();
container.RegisterManyForOpenGeneric(typeof(IEntityBaseService<>), typeof(IEntityBaseService<>).Assembly);
container.RegisterManyForOpenGeneric(typeof(IValidationService<>), typeof(IValidationService<>).Assembly);
public interface IEntityBase
{
    long Id { get; set; }
}

public abstract class EntityBase : IEntityBase
{
    public long Id { get; set; }
}

public class Content : EntityBase, IAudit
{
    public short Position { get; set; }

    public Content() 
    {
        Position = 1;
    }

}
container.Register<IValidate<Customer>, CustomerValidator>();
container.Register<IValidate<Employee>, EmployeeValidator>();
container.Register<IValidate<Order>, OrderValidator>();
container.Register<IValidate<Product>, ProductValidator>();

// can replace the above with the following:-
container.RegisterManyForOpenGeneric(
  typeof(IValidate<>),
  typeof(IValidate<>).Assembly);
container.RegisterOpenGeneric(
  typeof(IEntityBaseService<>),
  typeof(EntityBaseService<>));
container.Register(typeof(IValidator<>), new[] { typeof(IValidator<>).Assembly });