سؤال

لدي موفر عضوية/أدوار مخصص أستخدمه في وحدات تحكم MVC الخاصة بي وأريد أيضًا أن يكون بإمكان ASP.NET MVC الوصول إليه، حتى أتمكن من استخدام AuthorizationFilters، وما إلى ذلك.نظرًا لأن الكثير من الأشخاص قاموا بتطبيق موفري خدمة مخصصين، أتخيل أن العديد من الأشخاص قد فعلوا ذلك ولكني لم أكتشف ذلك أو أجد منشورات تتناول هذه المشكلة على وجه التحديد. هذا المشنور هو نوع من الجانب الآخر من سؤالي.في حالتي، يعمل الموفر المخصص بشكل جيد مع وحدات التحكم الخاصة بي، وأريد أن يستخدمه MVC أيضًا.

يتم تنفيذ مزود الخدمة الخاص بي باستخدام تصميم حقن IoC/التبعية.يكشف الموفر عن وظائف إضافية تتجاوز واجهة برمجة تطبيقات العضوية/الأدوار الأساسية.في وحدات التحكم الخاصة بي، أستخدم Castle Windsor لإنشاء المثيلات.يبدو الرمز مشابهًا لما يلي:

public class HomeController : Controller {
    IMembershipService _membershipService;
    public HomeController(IMembershipService membershipService) {
        _membershipService= membershipService;
    }
}

<castle>
 <components>
  <component id="MembershipService" 
             service="IMembershipService, MyApp" 
             type="MembershipService, MyApp" lifestyle="PerWebRequest">
    <parameters>
      <connectionString>#{defaultConnectionString}</connectionString>
    </parameters>
  </component>
 </components>
</castle>

public class WindsorControllerFactory : DefaultControllerFactory {
    private WindsorContainer _container;
    public WindsorControllerFactory() {
        _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

        List<Type> controllerTypes = new List<Type>();
        foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) {
            if (typeof(IController).IsAssignableFrom(t))
                controllerTypes.Add(t);
        }

        foreach (Type t in controllerTypes) {
            // LifestyleType.Transient = new controller instance for each request
            _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
        }
    }

    protected override IController GetControllerInstance(Type controllerType) {
        return (IController)_container.Resolve(controllerType);
    }

يعمل كل هذا بشكل رائع في كود C# الخاص بي ولكني أريد توصيل مزود الخدمة الخاص بي بـ MVC لاستخدام مرشحات [Authorize] معه:

[Authorize (Users="user1, user2", Roles="role8")]
public ViewResult MyResult(int x) {
    // implement
}

أعلم أن الطريقة المعتادة لإخبار ASP.NET عن موفر العضوية أو الأدوار المخصصة هي في ملف web.config كما هو موضح أدناه، ولكن إذا قمت بذلك، فسيحاول ASP.NET فقط استدعاء المُنشئ الافتراضي، وهو ما لن يعمل.أي مساعدة موضع تقدير.

<membership>
 <providers>
  <clear/>
  <add name="MyMembershipProvider" type="MyMembershipProvider">
 </providers>
</membership>
هل كانت مفيدة؟

المحلول

إن أبسط طريقة لتفعيل هذا الأمر هي استخدام آلية ASP.NET القياسية لـ <membership> في web.config.أنت فقط تسمح له باستخدام المُنشئ الافتراضي لكن قمت بتجاوز التهيئة () و يحذب التبعيات هناك.يستخدم هذا كمرجع.

شخصيًا، بسبب أشياء مثل هذه، أفضل تجنب نموذج الموفر تمامًا، لذا أستخدم نهجًا مشابهًا لتلك الأساليب الموصوفة في مستندات MonoRail.IMHO أقل انتفاخًا وأكثر مرونة.في النهاية، الأمر يتعلق فقط بالإعداد HttpContext.User مع السليم IPprincipal التنفيذ وهو ما يستخدمه AuthorizeAttribute.

أنا مؤخرا تم التدوين حول حل للقيام بـ IoC المناسب مع MembershipProviders.

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