2012-01-24 12 views
16

Próbuję użyć Dapper do interfejsu z tabelami ASP.NET SQL Membership Provider. Zawinęłem klasę SqlMembershipProvider i dodałem dodatkową metodę, aby uzyskać status MembershipUsers z uwzględnieniem pewnych kryteriów dotyczących niektórych niestandardowych tabel, które posiadam.Zadzwoń do konstruktora niestandardowego z Dapper?

Podczas wysyłania zapytania danymi za pomocą narzędzia Dapper wygląda na to, że Dapper najpierw tworzy instancję klasy za pomocą konstruktora bez parametrów, a następnie "odwzorowuje" zwrócone kolumny na właściwości obiektu.

Jednak właściwość UserName w klasie MembershipUser nie ma narzędzia ustawiającego. Sądząc po linii 1417 w Dapper SqlMapper.cs, metoda GetSettableProps() uzyskuje tylko właściwości ustawialne.

Próbowałem wykonać kwerendę MultiMap, aby wywołać konstruktora, ale problem z tym, że obiekty przekazane do kwerendy już brakuje nazwy użytkownika.

Zgaduję, że mogę zmodyfikować metodę GetSettableProps(), ale nie jestem pewien, czy to zadziała, czy też wpłynie na mój istniejący kod.

Czy muszę wywołać niestandardowy konstruktor, który ma klasa MembershipUser?

Czy istnieje rozsądna zmiana, którą mogę wprowadzić do Dappera, aby wesprzeć moją sytuację?

** UPDATE **

odpowiedź Marca użyć metody nierodzajową/Zapytanie dynamiczny() była poprawna, ale dla potomności, jest to metoda ja odnoszę się do wewnątrz Dapper:

static List<PropInfo> GetSettableProps(Type t) 
{ 
    return t 
      .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) 
      .Select(p => new PropInfo 
      { 
       Name = p.Name, 
       Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true), 
       Type = p.PropertyType 
      }) 
      .Where(info => info.Setter != null) 
      .ToList(); 
} 
+0

co ma wyglądać Linia 1417 btw można wysłać przykładowy kod dla innych, że być może w stanie pomóc szybko ..? – MethodMan

+1

Szczerze mówiąc, użyłbym tutaj pośredniego typu - lub Non-generic Query API (który przechodzi przez "dynamic") ... Mam trochę kodu ctor, który mogłem podnieść z protobuf-net, ale ja ' Naprawdę nie jestem pewien czy to byłoby korzystne ... –

Odpowiedz

24

chciałbym użyć nierodzajową API Query tutaj ...

return connection.Query(sql, args).Select(row => 
    new AnyType((string)row.Foo, (int)row.Bar) { 
     Other = (float)row.Other }).ToList(); 

Używanie tego można używać zarówno współpracy niż domyślny nstruktory i przypisania właściwości, bez żadnych zmian, używając "dynamicznego" jako kroku pośredniego.

+0

Wow, jestem zakłopotany, że całkowicie to przegapiłem! –

+3

To podejście wymusi jednoznaczne ustawienie wszystkich właściwości, prawda? Nie mogę, na przykład, skonstruować mojego typu, a następnie Dapper uruchomić swój kurs na właściwościach z wynikiem automatycznie ustawionym? – crush

+3

Nie wszyscy jeszcze pracują z programem Framework v4, który jest wymagany dla tego rozwiązania, które używa dynamicznego. Wygląda na to, że możesz uciec bez dynamicznego, jeśli użyjesz indeksowania Słownika, aby dostać się do wartości kolumn: stąd, gdzie Marc ma (int) row.Bar (wiersz jest dynamiczny w v4 z Dappera)), możesz użyć (int) wiersza [" Bar "] (w wierszu Dapper 3.5 to Słownik) i tak dalej. To nie jest przyjemne, ale w niektórych przypadkach może konieczne. – Nij

1

używam to może to pomóc komuś

YourList = connection.Query<YourQueryClass>(Query, arg) 
       .Select(f => new ClassWithConstructor(f.foo,f.bar)) 
       .ToList(); 
Powiązane problemy