Autofixture: القاموس المتزامن

تم إنشاؤها على ٢٤ أبريل ٢٠٢٠  ·  6تعليقات  ·  مصدر: AutoFixture/AutoFixture

أهلا،
عندما أستخدم المزج التلقائي لإنشاء Dictionary<T, U> أحصل على القيم فيه بشكل افتراضي ، ولكن مع ConcurrentDictionary<T, U> لا أفعل.

هل هذا عن طريق التصميم ويجب أن أستخدم منشئ عينات لتغيير هذا السلوك بنفسي ، أم أنها ميزة أو خطأ مفقود؟

التعليق الأكثر فائدة

أهلا،
لا يمكنني معرفة الأسباب الكامنة وراء ذلك ، ولكن بالنظر إلى الكود المصدري ، فإن المجموعات المدعومة مشفرة بشدة.
لذلك فهو ليس شيئًا مثل "هل اكتب تطبيق IDictionary" ، إنه "نوع قاموس <،>". لذلك لا يعمل ConcurrentDictionary.
لا تحتاج إلى إنشاء صانع العينات الخاص بك ، يمكنك استخدام ما هو موجود بالفعل:

      var fixture = new Fixture();

      var query = new ModestConstructorQuery();
      var methodInvoker = new MethodInvoker(query);
      var dictionaryFiller = new DictionaryFiller();
      var postProcessor = new Postprocessor(methodInvoker, dictionaryFiller);
      var exactTypeSpecification = new ExactTypeSpecification(typeof(ConcurrentDictionary<,>));
      var specimenBuilder = new FilteringSpecimenBuilder(postProcessor, exactTypeSpecification);

      fixture.Customizations.Add(specimenBuilder);

ال 6 كومينتر

إذا واجه أي شخص آخر نفس المشكلة ، فقد كتبت منشئ عينات لهذا:

public class ConcurrentDictionaryGenerator : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        Type type = request as Type;
        if (type == null)
        {
            return new NoSpecimen();
        }

        Type[] typeArguments = type.GetTypeInfo().GetGenericArguments();
        if (typeArguments.Length != 2 || typeof(ConcurrentDictionary<,>).MakeGenericType(typeArguments) != type)
        {
            return new NoSpecimen();
        }

        Type nonConcurrentDictionaryType = typeof(Dictionary<,>).MakeGenericType(typeArguments);
        IDictionary nonConcurrentDictionary = (IDictionary) context.Resolve(nonConcurrentDictionaryType);

        IDictionary concurrentDictionary = (IDictionary) Activator.CreateInstance(type);

        foreach (object key in nonConcurrentDictionary.Keys)
        {
            object value = nonConcurrentDictionary[key];
            concurrentDictionary.Add(key, value);
        }

        return concurrentDictionary;
    }
}

أهلا،
لا يمكنني معرفة الأسباب الكامنة وراء ذلك ، ولكن بالنظر إلى الكود المصدري ، فإن المجموعات المدعومة مشفرة بشدة.
لذلك فهو ليس شيئًا مثل "هل اكتب تطبيق IDictionary" ، إنه "نوع قاموس <،>". لذلك لا يعمل ConcurrentDictionary.
لا تحتاج إلى إنشاء صانع العينات الخاص بك ، يمكنك استخدام ما هو موجود بالفعل:

      var fixture = new Fixture();

      var query = new ModestConstructorQuery();
      var methodInvoker = new MethodInvoker(query);
      var dictionaryFiller = new DictionaryFiller();
      var postProcessor = new Postprocessor(methodInvoker, dictionaryFiller);
      var exactTypeSpecification = new ExactTypeSpecification(typeof(ConcurrentDictionary<,>));
      var specimenBuilder = new FilteringSpecimenBuilder(postProcessor, exactTypeSpecification);

      fixture.Customizations.Add(specimenBuilder);

كلما تعلمت المزيد عن الأجزاء الداخلية لهذه المكتبة ، كلما أحببتها أكثر

من المثير للاهتمام معرفة أنه Dictionary<,> فقط في الوقت الحالي وشكرًا للطريقة المضمنة في القيام بذلك!

أعتقد أن السؤال الوحيد المتبقي بالنسبة لشخص ما سيكون: هل ستكون هذه ميزة جيدة للإضافة؟ ربما ليس من أجل ConcurrentDictionary<,> على وجه التحديد ، لكن كل تطبيقات IDictionary<,> ؟

فقط لأنني لا أنشر معلومات خاطئة ، فهي ليست مجرد قاموس <،>. أردت فقط أن أشير إلى أنه يمكن العثور على قائمة الأنواع مباشرة في Fixture.cs. على سبيل المثال ، يتم أيضًا فرزها
بكل الوسائل أود أن أقول أن التنفيذ المستقبلي يجب أن يتحقق من الواجهة.

في الواقع ، ما تم تشفيره ليس الدعم بل حقيقة أن الواجهات يتم نقلها إلى نوع ملموس. مثل ID Dictionary و IReadOnlyDictionary يتم ترحيلها إلى القاموس ، وهكذا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات