C# 具有通用接口和组合的简单喷油器-不注册接口
从这里可以看到,我正在从继承转向合成 现在我已经让它全部工作了,但SimpleInjector希望我手动注册每个接口和传入的每个类型。这是条带化的代码 我有IBaseEntityService,它是BaseEntityService实现的,如下所示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
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 });