autofac과 저장소 패턴을 사용하는 dapper

asp.net-web-api autofac 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가 있습니다. 이 저장소를 사용하는 컨트롤러는 다음과 같습니다.

public class UsersController : ApiController
{
    private IRepository Repository;

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

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

DI로 autofac을 사용하고 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;

하지만 그것은 다음과 같은 오류가 발생하여 뭔가를 놓친 것 같습니다 : 'UserController'형식의 컨트롤러를 만들려고 할 때 오류가 발생했습니다. 컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오.

인기 답변

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

이 예제에서는 구조체 맵을 사용하고 있으므로 사용중인 컨테이너로 바꿉니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow