dapper avec autofac et modèle de référentiel

asp.net-web-api autofac dapper

Question

J'utilise dapper avec le modèle de référentiel dans une application WebApi et j'ai le problème suivant. La classe de référentiel est la suivante

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

L'interface IRepository n'a qu'une seule méthode, GetFirst. Un contrôleur qui utilise ce référentiel est le suivant

public class UsersController : ApiController
{
    private IRepository Repository;

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

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

J'utilise autofac comme DI et dans la méthode Application_Start dans Global.asax j'utilise le code suivant

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;

Mais il semble que je manque quelque chose car j'obtiens l'erreur suivante: Une erreur s'est produite lors de la tentative de création d'un contrôleur de type 'UsersController'. Assurez-vous que le contrôleur dispose d'un constructeur public sans paramètre.

Réponse populaire

Vous devez écraser l'activateur de contrôleur par défaut, car il n'a pas connaissance de votre conteneur DI.

Ajouter une classe de service:

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

Puis sur Application_Start ():

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

J'utilise la structure map dans cet exemple, remplacez-la par le conteneur que vous utilisez.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi