有autofac和存储库模式的小巧玲珑

时间:2014-06-20 12:57:43

标签: autofac asp.net-web-api dapper

我在WebApi应用程序中使用dapper与存储库模式,我有以下问题。 存储库类如下

  public class Repository : DataConnection, IRepository
  {

    public Repository(IDbConnection connection)
        : base(connection)
    {

    }

    public T GetFirst<T>(object filters) where T : new()
    {
        //Creates the sql generator
        var sqlGenerator = new MicroOrm.Pocos.SqlGenerator.SqlGenerator<T>();

        //Creates the query 
        var query = sqlGenerator.GetSelect(filters);

        //Execute the query
        return Connection.Query<T>(query, filters).FirstOrDefault();
    }

IRepository接口只有一个方法,即GetFirst。使用此存储库的Controller如下

public class UsersController : ApiController
{
    private IRepository Repository;

    public UsersController(IRepository repository)
    {
        Repository = repository;
    }

    public User Get(int id)
    {
        return Repository.GetFirst<User>(new { id });
    }
}

我使用autofac作为DI,并在Global.asax的Application_Start方法中使用以下代码

string connString =  ConfigurationManager.ConnectionStrings["DapperDemo"].ConnectionString;
        SqlConnection connnection = new SqlConnection(connString);
        var builder = new ContainerBuilder();
        builder.RegisterType<Repository>().As<IRepository>();
        builder.RegisterType<UsersController>().InstancePerRequest();
        var container = builder.Build();
        var resolver = new AutofacWebApiDependencyResolver(container);
        GlobalConfiguration.Configuration.DependencyResolver = resolver;

但似乎我遗漏了一些因为我收到以下错误: 尝试创建类型为&#39; UsersController&#39;的控制器时发生错误。确保控制器具有无参数的公共构造函数。

1 个答案:

答案 0 :(得分:0)

您需要覆盖默认控制器激活器,因为它不了解您的DI容器。

添加服务类:

public class ServiceActivator : IHttpControllerActivator
{
    public ServiceActivator(HttpConfiguration configuration) { }

    public IHttpController Create(HttpRequestMessage request
        , HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        var controller = ObjectFactory.GetInstance(controllerType) as IHttpController;
        return controller;
    }
}

然后在Application_Start():

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new ServiceActivator(GlobalConfiguration.Configuration));

我在这个例子中使用的是结构图,所以只需将它替换为你正在使用的容器。

相关问题