Frage

Ich habe über das Repository-Muster sah und erkannte ich einige Ideen, die ich in der Vergangenheit verwendet, die mir gut gemacht fühlen.

Doch nun würde Ich mag eine Anwendung schreiben, die dieses Muster verwenden würden, aber ich würde den Entitätsklassen ENTKOPPELTEN haben möge aus dem Repository-Anbieter.

Ich würde erstellen mehrere Baugruppen:

  1. eine „Schnittstellen“ Anordnung, die gemeinsame Schnittstellen einschließlich der IRepository Schnittstelle Host würde
  2. eine „Unternehmen“ Anordnung, die die Entitätsklassen wie Produkt Host würde, Benutzer, Ordnung und so weiter. Diese Anordnung würde durch die „Schnittstellen“ Assembly verwiesen werden, da einige Methoden solche Typen oder Anordnungen von ihnen zurückkehren würde. Auch wäre es von der Hauptbaugruppe (wie das Web Application) referenziert wird
  3. ein oder mehrere Repository-Anbieter Montage / Baugruppen. Jeder würde (zumindest) eine Klasse, die den IRepository-Schnittstelle implementiert, und es wäre mit einem bestimmten Datenspeicher arbeiten. Datenspeicher könnten einen SQL-Server umfassen, einen Oracle-Server, MySQL, XML-Dateien, Web / WCF-Dienste und so weiter.

LINQ to SQL Studium, die in Bezug auf die Zeit sehr produktiv sieht genommen alle umzusetzen scheint gut, bis ich die tiefe Abhängigkeit zwischen den generierten Klassen und der CustomDataContext Klasse entdecken.

Wie kann ich LINQ in einem solchen Szenario SQL?

War es hilfreich?

Lösung

Ich weiß nicht, ob dies ist genau das, was Sie wollen, aber Sie können einen Blick auf Rob Conery MVC Storefront-Code zu nehmen. Er nutzt eine Variante des Repository-Muster mit einem Linq-Anbieter. Er bildet die LINQ to SQL-Objekte zu Domain-Objekte und gibt dann die Domain-Objekte aus dem Repository-Provider zu einem Service-Schicht, die den Provider wickelt ihm erlaubt, wieder eine gewisse Logik auf den Daten zu arbeiten, bevor es die Business-Schicht trifft.

MVC Storefront Webcasts
-Code

Für mich klingt es wie Sie die Anbieter wollen DTOs zurückkehren und dann wollen Sie die DTOs auf die Domain-Objekte im Repository / Service-Schicht abzubilden. Wenn dies der Fall ist, könnten Sie Ihre LINQ to SQL-Provider auf die DTOs Karte, haben sie sie zurück, dann ordnen Sie die DTOs auf Domain-Objekte im Repository / Service-Schicht. Dies sollte gut funktionieren, aber es kann langweilig werden, wie Sie jetzt 2-Mapping-Schichten haben.

In diesem Fall würden Sie haben: Productservice, der eine IProductRepository nimmt. Es erinnert an Methoden, die auf dem IProductRepository Ihre DTOs zurück zu bekommen. Er bildet dann die DTOs an die realen Geschäftsobjekte und gibt sie an den anrufenden Code.

Andere Tipps

Sie können eine externe XML-Datei abbildet, die Datenbank zu jeder Klasse erstellen:

 <?xml version="1.0" encoding="utf-8"?>
 <Database Name="DbName" 
           xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
    <Table Name="DbTableName">
       <Type Name="EntityClassName" >
           <Column Name="ID" Type="System.Int64" Member="Id"
                   DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true"
                   CanBeNull="false" />
           <Column Name="ColumnName" Type="System.String" Member="PropertyA"
                   DbType="VarChar(1024)" CanBeNull="true" />
       </Type>
    </Table>
 </Database>

Und dann die XML zu einer Datacontext-Klasse übergeben:

 using (var cn = GetDbConnection())
  { var mappingSrc = XmlMappingSource.FromReader(xmlReader);

    using (var db = new DataContext(cn, mappingSrc))
     { var q = from entity in db.GetTable<EntityClassName>()
               where entity.PropertyA = "..."
               select entity.ID;
     }
  }

fand ich eine fantastische Blog-Post (mit vielen guten Code) über diese hier: http://iridescence.no/post/Linq-to-Sql-Programming-Against-an-Interface-and-the-Repository-Pattern.aspx

Ich glaube, Sie POCO (Plain Old CLR Objects) Unterstützung möchten. LINQ to SQL hat einen Adapter namens Close2Poco .

Aber ich würde Ihnen raten, den Schalter auf Entity Framework machen, im Moment haben sie auch eine POCO-Adapter , aber in v2 seine zu erwarten aus der Box unterstützt.

Sie müssen die LINQ nicht verwenden, um SQL-Code generiert, können Sie Ihre eigenen Klassen mit den notwendigen Columnattributes dekorieren oder eine externe XML-Mapping-Datei verwenden.

Der einfachste Weg wäre, um Ihre Einheiten aus dem Datacontext zu entkoppeln. Die benötigten Einheit laden, entkoppeln sie aus dem Datacontext, verwenden Sie es wie Sie wollen, eine spätere Verwendung Attach () zu koppeln es mit einem Datacontext für das Speichern

Leider hat LINQ keine Methode Einheiten von einem Datacontext zu entkoppeln, aber man kann sich nur klonen, die gut funktioniert. Einfachste Weg, um etwas so sein würde:

public static T CloneEntity<T>(T source)
{
  DataContractSerializer dcs = new DataContractSerializer(typeof(T));
  using (Stream stream = new MemoryStream())
  {
    dcs.WriteObject(stream, source);
    stream.Seek(0, SeekOrigin.Begin);
    return (T)dcs.ReadObject(stream);
  }
}

Ich habe etwas ähnliches mit WCF

1 auf Ihrem DBML stellen Sie Serialisierung-Modus unidirektional

2 Stellen Sie alle Spalten auf Ihre Tabellen Updatecheck = false

3 Schreiben Sie Ihren Service etwas wie folgt aus:

   public class Service1 : IService1
    {
        public Company GetCompany(int companyId)
        {
            using (DataClasses1DataContext dc = new DataClasses1DataContext())
            {
                return (from c in dc.Companies where c.CompanyId == companyId select c).Single();
            }
        }

    public void SaveCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.Attach(company, true);
            dc.SubmitChanges();
        }
    }

    public void InsertCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.InsertOnSubmit(company);
            dc.SubmitChanges();
        }
    }
}

4 einen Dienstverweis hinzufügen

Nicht genau das gleiche Szenario, aber ich arbeite ein Anpassungs-Tool zu erstellen, die auf einer XML-Datei basiert werden ein OO-Modell generieren. Mein Ansatz ist LINQ zu verwenden hinter der Szene SQL und da ich den Code automatisch bin zu erzeugen wäre es einfach einen anderen Mechanismus verwenden, um die Datenquelle MySQL lassen sagen. Da es nicht von LINQ unterstützt wird SQL finden Sie den Datenzugriffscode manuell schreiben, aber der Client-Code, den das OO-Modell in irgendeiner Weise ändern verwenden.

Könnte Ihre Klassen Entity implementieren IProduct, IUser, iOrder usw. Schnittstellen, die in Ihrem „Schnittstellen“ Montage deklariert werden würde? Auf diese Weise die IRepository Interface-Referenzen nur die Business-Objekt-Schnittstellen (das heißt, gibt Sammlungen von IProduct etc.) und die „Schnittstellen“ Montag von Ihrem anderen implementierungsspezifische Baugruppen entkoppelt sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top