在Web API中使用构造函数参数加载存储库(1)

时间:2014-02-26 09:24:41

标签: asp.net-web-api autofac

我正在尝试使用autofac获取以下方案,但我不确定如何构建我的代码以实现此目的。运行

我有一个存储库类,这个存储库类需要在初始化(构造函数)上获取项目键(字符串)。我想在我的Web Api提供给我的“Initialize”方法的初始化中实例化这个存储库,因为项目密钥将在我的路由中可用。

所以我不想调用“new ProductRepository(projectKey)”,而是想使用Autofac。有人能指出我正确的方向吗?我没有找到任何方法将特定数据发送到web api中的容器,因为容器/构建器仅在appStart中可用。 我应该将容器作为单件使用,以便我可以接近它,还是这种不好的做法?

3 个答案:

答案 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>();
    }
}