في CAL، كيف يمكنني الحصول على مرجع إلى مثيل وحدة؟

StackOverflow https://stackoverflow.com/questions/1017479

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي هذا التطبيق باستخدام CAL. جميع الوحدات مستمدة من فئة خاصة، ModuleBase، التي لديها وسيلة مجردة، ويقول ApplySecurity تنفيذها في كل واحد منهم.

وOK I تحميل وحدات في تشغيل الإطلاق، وبعد أسميه bootstrapper.Run()، أريد أن الوصول إلى جميع الوحدات التي تم تحميلها واستدعاء هذا الأسلوب ApplySecurity.

وحاولت هذه:

IModuleCatalog moduleCatalog = this.Container.Resolve<IModuleCatalog>();

moduleCatalog.Modules.ToList().ForEach(m => 
{
    (this.Container.Resolve(Type.GetType(m.ModuleType, false, false)) 
         as ModuleBase).ApplySecurity(); //^^^ this is making new instances!!
});

ولكن هذا يجعل حالات جديدة من وحدات، وأريد أن ترجع تلك التي تم تهيئته بالفعل.

وأنا آمل أن يكون واضحا بما فيه الكفاية،

وتيودور.

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

المحلول

ويبدو أن المشكلة هي أنه عندما يتم تسجيل الوحدة إلى الحاوية لم يتم تسجيله ك مثيل محددة، لذلك عند طلب حل يتم إنشاء مثيل جديد. لقد كان لي نظرة من خلال شفرة المصدر CAL والتخليص يحدث في منتصف مجموعة معقد من استدعاءات الأسلوب، لذلك أشك في أنك سوف تكون قادرة على توفير معقول تنفيذ الخاص بك.

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

public class ModuleInstanceCatalog : IModuleInstanceCatalog
{
     private Dictionary<Type, ModuleBase> _modules = new Dictionary<Type, ModuleBase>();

     public void RegisterModuleInstance(ModuleBase module)
     {
         _modules.Add(module.GetType(), module);
     }

     public ModuleBase GetModuleInstanceByType(Type type)
     {
         return _modules[type];
     }
}

في الخاص الإطلاق CreateShell ():

this.Container.RegisterInstance<IModuleInstanceCatalog>(new ModuleInstanceCatalog());

في Initilize كل وحدة في ():

IModuleInstanceCatalog catalog = this.Container.Resolve<IModuleInstanceCatalog>();
catalog.RegisterModuleInstance(this);

ثم استبدال رمز في سؤالك مع:

IModuleCatalog moduleCatalog = this.Container.Resolve<IModuleCatalog>();
IModuleInstanceCatalog instanceCatalog = this.Container.Resolve<IModuleInstanceCatalog>();

moduleCatalog.Modules.ToList().ForEach(m => 
{
    instanceCatalog.GetModuleInstanceByType(m.ModuleType).ApplySecurity();
});

وأنا لست سعيدا أكثر من اللازم مع هذا لأنه يشعر وكأنه قليلا من الهراء، ولكن ينبغي لها أن تعمل ما تريد.

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