سؤال

لقد بحثت على نمط مستودع و تعرفت على بعض الأفكار التي كانت تستخدم في الماضي مما جعلني أشعر بشكل جيد.

ولكن الآن أود أن أكتب أحد التطبيقات التي سوف تستخدم هذا النمط ولكن أود أن يكون الكيان الطبقات تنفصل من مستودع مزود.

وأود أن إنشاء العديد من الجمعيات :

  1. و "واجهات" الجمعية التي ستستضيف واجهات المشتركة بما في ذلك واجهة IRepository
  2. و "الكيانات" الجمعية التي ستستضيف الكيان فئات مثل المنتج المستخدم والنظام جرا.هذه الجمعية أن يكون المشار إليه من قبل "واجهات" الجمعية منذ بعض الأساليب سيعود مثل هذه الأنواع أو صفائف منهم.أيضا سيكون المشار إليه من قبل التطبيق الرئيسي للجمعية (مثل تطبيق ويب)
  3. واحد أو أكثر من مستودع مزود الجمعية/الجمعيات.كل منها تشمل (على الأقل) من الفئة التي تطبق IRepository واجهة العمل مع بعض من مخزن البيانات.مخازن البيانات يمكن أن يتضمن SQL Server, Oracle server, MySQL, ملفات XML Web / خدمات WCF وهلم جرا.

دراسة LINQ to SQL التي تبدو مثمرة جدا من حيث الوقت المستغرق في تنفيذ كل شيء يبدو على ما يرام حتى اكتشاف عمق تبعية بين فئات ولدت و CustomDataContext الدرجة.

كيف يمكنني استخدام LINQ to SQL في مثل هذا السيناريو ؟

هل كانت مفيدة؟

المحلول

أنا لا أعرف إذا كان هذا هو بالضبط ما تريد ، ولكن قد ترغب في إلقاء نظرة على روب Conery MVC واجهة المدونة.انه يستخدم متغير من نمط مستودع مع linq مزود.كان خرائط LINQ to Sql الكائنات إلى كائنات المجال ثم ترجع كائنات المجال من مستودع مزود خدمة الطبقة التي يلتف مزود مما يسمح له أن عمل بعض المنطق على البيانات التي تم إرجاعها قبل أن يضرب طبقة رجال الأعمال.

MVC واجهة البث
رمز

بالنسبة لي يبدو أنك تريد مقدمي العودة DTOs ثم تريد خريطة DTOs إلى المجال الكائنات في المخزون/الخدمات طبقة.إذا كانت هذه هي الحالة يمكنك أن الخريطة الخاصة بك LINQ to SQL مقدم إلى DTOs, قد تعود لهم ، ثم خريطة DTOs إلى المجال الكائنات في المخزون/الخدمات طبقة.هذا يجب أن تعمل على ما يرام, ولكن قد تصبح مملة كما سيكون لديك الآن 2 خرائط طبقات.

في هذه الحالة سيكون لديك:ProductService الذي يأخذ IProductRepository.فإنه يثير الطرق على IProductRepository للحصول على ظهرك DTOs.ثم خرائط DTOs إلى العمل الحقيقي الكائنات و يعود بهم إلى استدعاء التعليمات البرمجية.

نصائح أخرى

يمكنك إنشاء ملف XML الخارجية تعيين قاعدة البيانات إلى أي فئة:

 <?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>

ومن ثم تمرير XML إلى DataContext الدرجة:

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

لقد وجدت بلوق رائعة وظيفة (مع الكثير من التعليمات البرمجية جيد) عن هذا هنا: http://iridescence.no/post/Linq-to-Sql-Programming-Against-an-Interface-and-the-Repository-Pattern.aspx

أعتقد أنك تريد بوكو (القديم عادي الكائنات CLR) الدعم.LINQ to SQL يحتوي على محول يسمى Close2Poco.

ولكن أنصح جعل التحول إلى إطار الكيان في لحظة لديهم أيضا بوكو محول, ولكن في v2 المتوقع أن تكون معتمدة من خارج منطقة الجزاء.

لم يكن لديك إلى استخدام LINQ to SQL البرمجية التي تم إنشاؤها ، يمكنك تزيين الخاص بك الطبقات اللازمة ColumnAttributes أو استخدام خارجي XML ملف التعيين.

أبسط طريقة هي فصل الكيانات من datacontext:تحميل اللازمة كيان فصل من DataContext ، واستخدامها كيفما تشاء ، في وقت لاحق استخدام إرفاق() إلى زوجين مع DataContext من أجل إنقاذ.

للأسف LINQ لا يوجد لديه طريقة فصل الكيانات من datacontext, ولكن يمكنك فقط استنساخ لهم, أنه يعمل بشكل جيد.أبسط طريقة سيكون شيئا مثل هذا:

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

لقد فعلت شيئا من هذا القبيل مع WCF

1 على DBML, تحدد لك التسلسل وضع أحادي الاتجاه

2 تعيين كافة الأعمدة في الجداول الخاصة بك إلى UpdateCheck=false

3 الكتابة الخدمة الخاصة بك كما يلي:

   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 إضافة الخدمة المرجعية

ليس بالضبط نفس السيناريو, ولكن أنا أعمل على إنشاء أداة مخصصة استنادا إلى ملف XML سوف تولد OO نموذج.توجهي هو استخدام LINQ to SQL وراء المشهد و أنا منذ إنشاء هذا الرمز تلقائيا سيكون من السهل أن استخدام آلية أخرى دعونا نقول الخلية مصدر البيانات.لأنه غير معتمد من قبل LINQ to SQL سيكون لديك لكتابة رمز وصول البيانات يدويا ، ولكن العميل التعليمات البرمجية التي سوف تستخدم OO نموذج تغيير بأي شكل من الأشكال.

هل يمكن أن الكيان الطبقات تنفيذ IProduct, IUser IOrder.... الخواجهات أن يعلن في "واجهات" الجمعية ؟ هذه الطريقة IRepository واجهة المراجع فقط الكائن الأعمال واجهات (أي عوائد مجموعات من IProduct.... الخ) و "واجهات" الجمعية تنفصل عن الأخرى الخاصة بك تنفيذ محددة الجمعيات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top