我正在尝试使用autofac获取以下方案,但我不确定如何构建我的代码以实现此目的。运行
我有一个存储库类,这个存储库类需要在初始化(构造函数)上获取项目键(字符串)。我想在我的Web Api提供给我的“Initialize”方法的初始化中实例化这个存储库,因为项目密钥将在我的路由中可用。
所以我不想调用“new ProductRepository(projectKey)”,而是想使用Autofac。有人能指出我正确的方向吗?我没有找到任何方法将特定数据发送到web api中的容器,因为容器/构建器仅在appStart中可用。 我应该将容器作为单件使用,以便我可以接近它,还是这种不好的做法?
答案 0 :(得分:0)
有nuget package为Web Api提供DependencyResolver
,与AutoFac集成。创建DependencyResolver,将其分配给配置,在autofac容器中注册控制器。
答案 1 :(得分:0)
:
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = resolver;
在您的控制器中:
public class MyController : ApiController
{
public MyController(IComponentContext container)
{
var key = new NamedParameter("projectKey", "keyFromRoute");
var repository = container.Resolve<ProductRepository>(key);
}
}
应该这样做。
答案 2 :(得分:0)
我正在做一些假设,因为你没有提供你的代码,但我认为你有类似的东西:
public class ProductRepository
{
public ProductRepository(DbContext dbContext, int projectKey)
{
}
}
public class SomeController : Controller
{
private readonly Func<int, ProductRepository> _repoFactory;
public SomeController(Func<int, ProductRepository> repoFactory)
{
_repoFactory = repoFactory;
}
public void DoStuff(int projectKey)
{
var repo = _repoFactory(projectKey);
repo.DoStuff();
}
}
public class RepositoryModule : Module
{
public override Load(ContainerBuilder builder)
{
builder.RegisterType<ProductRepository>();
}
}