سؤال

أحاول تنفيذ حقن التبعية في بنيتي (MVC، DDD - Domain Model، Repository).وتتضمن بنيتي ASP.NET Identity 2.0.

في هذه المرحلة، لا أريد أن تتحكم شركة DI في أي من كائنات Identity 2.0 (UserAdminController، وRolesAdminController...).أفضل الكائنات الأمنية خارج DI.في هذه المرحلة، يبدو دمج كائنات الهوية في DI أمرًا صعبًا للغاية.لقد ألقيت نظرة فاحصة لمعرفة ما إذا كان شخص ما قد قام بذلك بالفعل، حتى أتمكن من القراءة ومعرفة كيفية القيام بذلك.لم أتمكن من العثور على أي شيء.(تم العثور على مشاركة واحدة قريبة، ولكن لا يوجد حل).

على أي حال، لقد اتبعت تطبيق Simple Injector MVC (انظر الكود القياسي أدناه)، وجربت العديد من الأشياء، وأعتقد أن المشكلة تكمن في الاتصال سجلMvcControllers.

صحّحوني إذا كنت مخطئًا، ولكن هذا البيان سيلتقط جميع وحدات التحكم بأسمائها بعد تثبيتها بكلمة "وحدة التحكم".

سؤال:كيف يمكنني تحديد وحدات التحكم التي سيتم تسجيلها في Simple Injector؟(هل يسمى هذا التسجيل اليدوي؟)

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

...

...

...تم استدعاؤه من Application_Start()

        // Create a Simple Injector container
        var container = new Container();

        // Configure the container
        InitializeContainer(container);

        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

        // Verify the container's configuration
        container.Verify();

        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));


    private static void InitializeContainer(Container container)
    {
        container.Register<MyService1>();            

        container.Register<IMyRepositoryA, MyRepositoryA>();

        // Trying to include Identity into Simple Injector - please ignore
        container.Register<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>(new ApplicationDbContext()));
    }
هل كانت مفيدة؟

المحلول

ال RegisterMvcControllers سيتم تسجيل الأنواع التالية:

  • يجب أن يكون النوع عامًا
  • يجب تنفيذ النوع System.Web.Mvc.IController
  • يجب ألا يكون النوع مجردًا
  • يجب ألا يكون النوع تعريفًا عامًا للنوع
  • يجب أن ينتهي اسمه بـ "Controller"

يمكنك أن ترى ما يحدث هنا في التعليمات البرمجية المصدر.

ال RegisterMvcControllers يستدعي أسلوب التمديد إلى SimpleInjectorMvcExtensions.GetControllerTypesToRegister طريقة للحصول على قائمة وحدات التحكم للتسجيل.يمكنك استدعاء هذه الطريقة بنفسك لمعرفة ما تم تسجيله على النحو التالي:

var registeredControllerTypes =
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())

لذا بدلاً من الاتصال RegisterMvcControllers يمكنك تسجيل وحدات التحكم بنفسك عن طريق الاتصال بـ GetControllerTypesToRegister طريقة:

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly());

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}

بهذه الطريقة يمكنك تصفية أي وحدة تحكم تريد تسجيلها يدويًا:

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())
    .Where(type => type.Name != "UserStore`1");

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}

خيار آخر هو تجاوز التسجيل:

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

container.Options.AllowOverridingRegistrations = true;

container.Register<IUserStore<ApplicationUser>>(
    () => new UserStore<ApplicationUser>(new ApplicationDbContext()))

// Always set the option back to false ASAP to prevent configuration errors.
container.Options.AllowOverridingRegistrations = false;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top