我想使用autofac與存儲庫,我試圖添加一點泛型,以減少重複代碼的數量,我正在寫。但是,我正在圍繞圈子試圖獲得autofac工作對我來說使用通用資源庫綁定autapac與webapi
所以我創建了一個的DomainService和界面處理我們的標準CRUD操作
public class DomainService<T>:IDomainService<T>
{
protected readonly IDomainService<T> Repository;
public DomainService(IDomainService<T> repository)
{
Repository = repository;
}
public IQueryable<T> GetQueryable()
{
return Repository.GetQueryable();
}
public virtual Task<T> Add(T entity)
{
return Repository.Add(entity);
}
接口:
public interface IDomainService<T>
{
IQueryable<T> GetQueryable();
Task<T> Add(T entity);
Task<bool> Delete(T entity);
Task<T> Update(T entity);
Task<T> GetById(int id);
Task<T> GetByUID(Guid id);
}
我用我的回購是沒有什麼特別的
public class SkillRepository : DomainService<Skill>, ISkill
{
private DataContext _db = new DataContext();
private readonly ILogger _log = null;
public SkillRepository(IDomainService<Skill> repository, ILogger log) : base(repository)
{
_log = log;
}
}
最後,我線了autofac:
var builder = new ContainerBuilder();
// Register the Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// Register other dependencies.
builder.Register(c => new Logger()).As<ILogger>().InstancePerApiRequest();
builder.RegisterType<SkillRepository>()
.As<IDomainService<Skill>>()
.As<ISkill>()
.InstancePerRequest();
// Build the container.
var container = builder.Build();
// Create the depenedency resolver.
var resolver = new AutofacWebApiDependencyResolver(container);
// Configure Web API with the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver = resolver;
我的Web API控制器看起來像
public class SkillsController : BaseController<Skill>
{
private readonly ISkill _skillRepository;
public SkillsController(SkillRepository skillRepository) : base(skillRepository)
{
_skillRepository = skillRepository;
}
}
BaseController
public abstract class BaseController<TEntity> : ApiController
where TEntity : new()
{
protected readonly IDomainService<TEntity> DomainService;
protected BaseController(IDomainService<TEntity> domainService)
{
DomainService = domainService;
}
我得到了ñ例外:
「與 ‘Autofac.Core.Activators.Reflection.DefaultConstructorFinder’發現式 ‘Api.EndPoints.Skills.SkillsController’建設者都不能與 可用的服務和參數來調用:\\無法解析參數 'Domain.Repository.SkillRepository skillRepository'的構造函數 'Void .ctor(Domain.Repository.SkillRepository)'。「
有什麼明顯的,我做錯了嗎?
謝謝伊恩你的詳細解釋。這聽起來像我做的事情有點不對。我已經更新了上面的代碼域名服務,試着展示我正在嘗試做的事情。從本質上講,我試圖使用DomainService作爲從我必須在每個存儲庫上實現IDomainService的方式。由於每個回購代碼都是相同和無聊的。那有意義嗎? –
2014-10-16 03:58:11
有道理,但是使用Composition而不是Inheritance可能會更好。 http://en.wikipedia.org/wiki/Composition_over_inheritance – 2014-10-16 05:06:47
另外,當您避免使用「Fat Controllers」(通常是正確的做法)時,您很少需要控制器的基類。 – 2014-10-16 05:12:10