structuremap فتح مثيلات اسم عام
-
27-09-2019 - |
سؤال
يجب أن أفعل ما يلي:
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 ... ولكن مرة أخرى يمكنك دفع ذلك لأعلى. لاحظ أنه في النهاية ستحتاج إلى معلمة النوع.