这是问题所在:我正在研究使用通用存储库的解决方案,存储库工作正常等等。问题是我试图重构代码以启用对控制器构造函数的注入依赖项。为什么我要实现这个?,解决方案使用 TDD,我们希望简化应用程序的测试方式。我不想像我们实际所做的那样创建假货,而不是我真的想利用 EF 存储库的好处并在编译时解决,如果我使用 FakeRepository(在级别实体进行更改)和真正的存储库对数据库的更改。
我使用 EF 作为持久性技术。
这些行代表存储库
public class Repository<T> : IRepository<T> where T
: class, IEntity
{
private readonly DbSet<T> dbset;
private readonly DbContext _context;
public Repository(DbContext context)
{
_context = context;
dbset = context.Set<T>();
}
public void Add(T entity)
{
//Some logic...
}
public void Update(T entity)
{
//Some logic...
}
//more methods...
}
这些行代表 Fake Repository
public class FakeRepository<T> : IRepository<T> where T
: class, IEntity
{
private readonly DbSet<T> dbset;
private readonly DbContext _context;
public FakeRepository(DbContext context)
{
_context = context;
dbset = context.Set<T>();
}
public void Add(T entity)
{
//Some logic...
}
public void Update(T entity)
{
//Some logic...
}
public void Remove(T entity)
{
//Some logic...
}
//more methods...
}
这些行代表存储库的接口契约。
public interface IRepository<T>
where T : class, IEntity
{
void Add(T entity);
void Remove(T entity)
void Remove(T entity);
//more methods...
}
这是一个控制器示例,它的构造函数需要 previos 类型的 Generic。
public class DemoController : Controller
{
private readonly IRepository<IEntity> _repository;
public DemoController(IRepository<IEntity> repository)
{
_repository = repository;
}
public ViewResult Index()
{
return View(_repository.FindAll());
}
}
所以,问题是......我如何在 Autofac 容器上注册类型。我看到很多关于如何实现这一点的论坛,但没有找到解决这个需求的方法。
在 global.asax 中尝试过:
protected void Application_Start()
{
ConfigureIoC();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
private static void ConfigureIoC()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(Global).Assembly);
//At this section the dependencies are added in order to resolve Types.
builder.RegisterType<MyController>().InstancePerHttpRequest();
builder.RegisterType<MyContext>().As<DbContext>();
builder.RegisterType<Repository<Entity>>().As<IRepository<IEntity>>();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
我也尝试注册单个类型,但 autofac 根本不知道如何解析控制器构造函数。
提前致谢!。