gpt4 book ai didi

asp.net-mvc-3 - 使用 Autofac 注入(inject) MVC 3 通用存储库

转载 作者:行者123 更新时间:2023-12-02 22:43:51 25 4
gpt4 key购买 nike

问题来了:我正在研究使用通用存储库的解决方案,存储库工作正常等等。重要的是,我正在尝试重构代码以启用对 Controllers 构造函数的注入(inject)依赖项。为什么我要实现这个?解决方案使用 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...

}

这些行代表假存储库

    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...
}

这些行代表存储库的接口(interface)契约。

public interface IRepository<T>
where T : class, IEntity
{
void Add(T entity);
void Remove(T entity)
void Remove(T entity);
//more methods...
}

这是一个 Controller 示例,其构造函数需要一个 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 根本不知道如何解析 Controller 构造函数。

提前致谢!

最佳答案

您正在注入(inject) IRepository<IEntity>进入DemoController ,这很奇怪,因为 IEntity不是一个具体的实体并且DemoController可能需要一个具体的实体(例如 Customer )。因为你想映射 IRepository<T>具体到Repository<T> ,您需要进行以下注册:

builder.RegisterGeneric(typeof(Repository<>))
.As(typeof(IRepository<>));

您可能还需要注册 DbContext根据网络请求,或在生命周期范围内。注册 MyController 似乎很奇怪作为PerHttpRequest .

关于asp.net-mvc-3 - 使用 Autofac 注入(inject) MVC 3 通用存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10336983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com