تعيين التبعية الداخلية حسب نوع باستخدام Structuremap

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي التكوين structuremap التي قد لي الخدش رأسي. لدي فئة محددة تتطلب عنصر واجهة المستخدم ربطه الذي يتطلب فئة التحقق من صحة ربطه. أريد الطبقة ملموسة الخارجي للحصول على عنصر واجهة المستخدم الافتراضية، ولكن الحصول على الكائن التحقق من صحة ملموسة لفئة محددة. شيء من هذا القبيل:

class MyView 
{
   IPrompt prompt
}

class GenericPrompt : IPrompt
{
   IValidator validator
}

class MyValidator : IValidator
{
   bool Validate() {}
}

وكيف يمكنني تكوين structuremap مع DSL التسجيل لاستخدام MyValidator فقط عند إنشاء تبعيات MYVIEW. (والذين يفترض ان تستخدم BobsValidator عند إنشاء تبعيات BobsView)

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

المحلول

وأنت تحصل على MYVIEW (وBobsView) من الحاوية؟ يمكننا أن نفترض أنها سوف تتخذ جميع مثيل IPrompt؟

ونهج واحد سيكون لتسجيل كل لأدوات تقييم الخاص بك مع اسم يطابق أسماء وجهة نظركم. هل يمكن تنفيذ نوع الخاصة بك الماسح الضوئي التي تزيل فقط لاحقة المصادقة:

public class ValidatorScanner : ITypeScanner
{
    public void Process(Type type, PluginGraph graph)
    {
        if (!typeof (IValidator).IsAssignableFrom(type)) return;
        var validatorName = type.Name.Replace("Validator", "");
        graph.AddType(typeof(IValidator), type, validatorName);
    }
}

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

public class ValidatorRegistry : Registry
{
    public ValidatorRegistry()
    {
        Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.With<ValidatorScanner>();
        });

        ForRequestedType<IPrompt>().TheDefault.Is.ConstructedBy(ctx =>
        {
            var viewName = ctx.Root.RequestedType.Name.Replace("View", "");
            ctx.RegisterDefault(typeof(IValidator), ctx.GetInstance<IValidator>(viewName));
            return ctx.GetInstance<GenericPrompt>();
        });
    }
}

لاسترداد وجهة نظركم مع المدقق المناسبة، فإن عليك أن تطلب من نوع الخرسانة:

var view = container.GetInstance<MyView>();

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

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