سؤال

أحاول معرفة سمة حقن بنية MEF. ليس لدي أي فكرة عن كيفية إخبارها بتحميل معلمات المنشئ.

هذا هو العقار الذي أحاول تحميله

[ImportMany(typeof(BUsers))]
public IEnumerable<BUsers> LoadBUsers { get; set; }

هنا هو الرمز الذي أستخدمه لاستيراد التجميعات.

try
{
    var catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
    catalog.Catalogs.Add(new DirectoryCatalog("DI")); 
    var container = new CompositionContainer(catalog);
    container.ComposeParts(this);
}

هنا الفصل الذي أحاول تحميله

[Serializable]
[Export(typeof(BUsers))]
public class EditProfile : BUsers
{
    [ImportingConstructor]
    public EditProfile(string Method, string Version)
    {            
        Version = "2";
        Action = "Edit";
        TypeName = "EditProfile";
    }
هل كانت مفيدة؟

المحلول

عند استخدام سمة ImportingConstructor، تصبح المعلمات إلى المنشئ الواردات. بشكل افتراضي، يعتمد ما تقوم باستيراده (اسم العقد) على نوع المعلمة أو الممتلكات التي تستورد إليها. لذلك في هذه الحالة، فإن نوع العقد لكل من وارداتك هو سلسلة، وليس هناك فرق حقيقي بين المعلمة الأولى والثانية.

يبدو أنك تحاول استخدام الواردات لتزويد قيم التكوين، والتي ليست بالضرورة ما تم تصميمه ل. للحصول عليه للقيام بما تريد، يجب عليك تجاوز اسم العقد لكل من المعلمات، مثل هذا:

[ImportingConstructor]
public EditProfile([Import("Method")] string Method, [Import("Version")] string Version)
{ }

ثم تحتاج إلى صادرات للطريقة والإصدار في الحاوية الخاصة بك. طريقة واحدة للقيام بذلك هي فقط لإضافةها مباشرة:

var container = new CompositionContainer(catalog);
container.ComposeExportedValue("Method", "MethodValue");
container.ComposeExportedValue("Version", "2.0");
container.ComposeParts(this);

(لاحظ أن COMPOSEEXPORTEDEVALUE هو في الواقع طريقة تمديد محددة على فئة EmbibutedModelServicesServices.)

إذا كنت ترغب في قراءة هذه القيم من ملف التكوين من نوع ما، فيمكنك إنشاء مزود التصدير الخاص بك الذي يقرأ التكوين ويوفر القيم فيه كصادرات إلى الحاوية.

سيكون هناك طريقة بديلة للتعامل مع هذا فقط استيراد واجهة توفر الوصول إلى قيم التكوين حسب الاسم، والحصول على القيم التي تحتاجها من جسم المنشئ.

نصائح أخرى

أنا أحب حل دانيال. ومع ذلك، فإن الشيء الوحيد الذي أراه هو اقتران ضيق أسماء المعلمات بين الممثل (الذي يخلق مركبة كونتراس ()) وجزء تصدير مع [ImportingConstructor] للمطواب المخصص. على سبيل المثال، يتم مطابقة "الطريقة" اثنين في كلا المكانين. يجعل من الصعب الحفاظ على جزء التصدير إذا كان الممثل والتصدير جزء في اختلاف المشاريع.

إذا كان ذلك ممكنا، أود أن أضيف المحطة الثانية إلى فئة جزء التصدير. علي سبيل المثال:

[Export(typeof(BUsers))] 
public class EditProfile : BUsers
{
    [ImportingConstructor]
    public EditProfile(EditProfileParameters ctorPars)
    : this(ctorPars.Method, ctorPars.Version) {}

    public EditProfile(string Method, string Version)
    {
        Version = "2";
        Action = "Edit";
        TypeName = "EditProfile";
    }

يجب أن تكون فئة EDITPROFILEPLEARTMETERS واضحة: خصائصا من الطريقة والإصدار:

[Export]
public class EditProfileParameters{
   public string Method { get; set; }
   public string Version { get; set; }
}

النقطة الأساسية هي إضافة سمة التصدير إلى الفصل. ثم يجب أن يكون MEF قادرا على تعيين هذا الفصل إلى المعلمة المحطة الطرفية للتحرير.

هنا هو مثال لإضافة جزء التصدير إلى الحاوية:

var container = new CompositionContainer(catalog);
var instance1 = new EditProfileParameters();
// set property values from config or other resources
container.ComposeExportedValue(instance1);
container.ComposeParts(this);

على الرغم من أن وقت متأخر من اللعبة، إلا أنه نهج آخر يرفع ميزة أقل شهرة من MEF: صادرات العقارات

public class ObjectMother
{
    [Export]
    public static EditProfile DefaultEditProfile
    {
        get
        {
            var method = ConfigurationManager.AppSettings["method"];
            var version = ConfigurationManager.AppSettings["version"];

            return new EditProfile(method,version);
        }
    }
}

لا توجد حاجة إلى تفضيل للأشياء الكيميائية لهذا العمل، ولا توجد سمات مطلوبة في التحرير.

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