ASP .Net Identity, Dapper 및 저장 프로 시저 모범 사례

asp.net asp.net-identity c# dapper stored-procedures

문제

나는 Dapper 마이크로 ORM 및 ASP.NET 신원을 배우기 위해 현재이 가이드 를 따르고 있습니다. 기본 CRUD 작업을 수행하는 데 도움이되는 일반 저장소 패턴을 구현하여 조금 섞어서 생각했습니다.

다음은 수업입니다.

User.cs

public class User : IUser
{
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    public string PasswordHash { get; set; }
    public string SecurityStamp { get; set; }

    string IUser<string>.Id
    {
        get { return UserId.ToString(); }
    }
}

Repository.cs

public class Repository<T> : IRepository<T> where T : class
{
    public int ExecuteScalar(string query, object arguments)
    {
        var id = 0;

        using (var connection = ConnectionFactory.CreateConnection())
        {
            id = connection.ExecuteScalar<int>(query, arguments, commandType: CommandType.StoredProcedure);
        }

        return id;
    }
}

UserStore.cs

public class UserStore : IUserStore<User>, IUserLoginStore<User>, IUserPasswordStore<User>, IUserSecurityStampStore<User>
{
    private IRepository<User> repository;

    public UserStore(IRepository<User> repository)
    {
        this.repository = repository;
    }

    #region IUserStore
    public virtual Task CreateAsync(User user)
    {
        if (user == null)
            throw new ArgumentNullException("user");

        return Task.Factory.StartNew(() =>
        {
            user.UserId = Guid.NewGuid();
            repository.ExecuteScalar("sp_InsertUser",
                new { UserId = user.UserId, UserName = user.UserName, Password = user.PasswordHash,
                    SecurityStamp = user.SecurityStamp });
        });
    }
}

내 게시물을 더 짧게 만들기 위해 다른 방법과 클래스를 제공하지 않았습니다. SQL 연결을 생성하는 연결 팩토리는 UserStore 의 인터페이스 일부인 메소드 일부입니다.

나는 다음과 같은 질문을 가지고있다.

  1. User 개체를 그대로 ExecuteScalar 메서드에 전달하는 방법이 있습니까? 매번 모든 매개 변수를 입력하는 대신
  2. 내 CRUD 작업을 저장 프로 시저로 만드는 것이 가장 좋습니다. 예를 들어 여기에 sp_InsertUser .
  3. 비동기 메서드가 문제를 일으킬 수 있습니까?
  4. 나는 SQL 쿼리를 작성하여 Dapper에 전달하려고합니다 (XML 파일에 쿼리를 추가하고 거기에서 읽음). 나는이 안내서를 보았고 모든 것이 일반적이라는 사실을 좋아했으며 코드를 최소화하고 깔끔한 것을 만들 수 있었다. 문자열 형식을 호출하고 매개 변수를 전달하는 것이 가장 좋습니다.

    string.Format ( "{{0}} SET {1} WHERE {2}", typeof (T) .Name, sqlValuePairs, sqlIdPairs)

긴 게시물에 대해 정말 사과드립니다.하지만 저는이 기술에 익숙하지 않고 그 기술을 배우려고합니다. 그러나 기사를 검색할수록 혼란스러워집니다.

수락 된 답변

  1. 매개 변수 이름과 속성 이름이 완전 일치하면 user 전달할 수 있습니다. 그러나 dapper는 인라인 텍스트에 필요한 매개 변수를 확인하려고 시도하지만 저장 프로 시저에서는이 작업을 수행 할 수 없으므로 모든 정보를 보내려고합니다.
  2. 크게 의견과 취향이다; 이 작업을 자동화 할 수있는 dapper.contrib 및 dapperextensions와 같은 도구가 있습니다.
  3. ExecuteScalarAsync와 같은 실제 비동기 메서드를 선호해야합니다.
  4. 성명이 아닌 질문으로 보인다.

편집 된 4 :

  1. 음, 취약점으로 이어질 수있는 방법에는 여러 가지가 있습니다. 그러나 당신이 투입물을 단단히 통제한다면 그것은 효과가 있을 수 있습니다 . 비슷한 일을했을 때가 있습니다. 하지만 이것은 "dapper.contrib"와 같은 것이 테이블에 가져 오는 것과 거의 같습니다.


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.