سؤال

يجب أن أفعل ما يلي:

var someType = ObjectFactory.GetNamedInstance("myNamedInstance");

حيث يمكن أن يكون Sometype أي تطبيق ICommand.

لذلك قمت بتسجيل بعضهم:

For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1");
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2");

هل هناك طريقة للقيام بذلك في structuremap ، لأن getNamedInstance يتطلب المعلمة النوع التي لا أعرفها حتى وقت التشغيل.؟

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

المحلول

(لهذا ، أنا أفترض أنت خلقت ICommand<T>)

هذا في الواقع لا معنى له ... فكر في الخط:

//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);

افترض الآن أنك لن تستخدم var, وبدلاً من ذلك النوع الفعلي. ماذا تضع هناك يمكن أن تجمع؟ وهذا هو ، ما هو النوع الذي يمكن أن يكون الأمر غير ذلك بخلاف object?

أيضا ، تذكر ذلك ICommand<string> و ICommand<int> كلاهما من النوعين من ICommand<T>, ، لكنها غير مرتبطة بخلاف ذلك - ليس لديهم نوع أساسي مشترك بخلاف object.

إذا لم تقم بالنوع حتى وقت التشغيل ، فلن تساعد الأدوية الجماهيرية - بدلاً من ذلك اجعل ICommand<T> يرث من بعض الواجهة المشتركة - مثل ICommandBase - هذا لديه الطرق التي تحتاجها بالفعل.

ومع ذلك ، إذا كنت لا تعرف النوع في هذه الطريقة, ، يمكنك دفع "UP" المجهول في الترجم عن طريق جعل الطريقة التي تحتوي على تلك العامة:

public void Execute<T>( string commandName)
{        
    var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
    someType.Execute();
}

الآن يحتاج متصل التنفيذ إلى نوع param ... ولكن مرة أخرى يمكنك دفع ذلك لأعلى. لاحظ أنه في النهاية ستحتاج إلى معلمة النوع.

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