هل يمكنني إنشاء عناصر تحكم IOC باستخدام .NET لتوضع في مشاريع على شبكة الإنترنت؟

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

سؤال

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

ولذا أود أن يكون شيئا مشابهة لما يلي في صفحة الويب نفسها:

<prefix:ControlName ID="myControl" runat="server" property="value1" />

وان السيطرة على منشئ مشابهة:

public ControlName (IControlLogic logic)

وثم مثالي حاوية اللجنة الأولمبية الدولية أن التعامل مع الحقن. هل يمكن هذا؟ إذا كان الأمر كذلك ما تقدمه المكتبات هذا؟ إذا كان لديك أي الروابط التي كنت تعرف أن مناقشة هذا أنها ستكون بفضل كبير.

وشكرا مقدما

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

المحلول 3

للأسف لا يوجد إجابة واحدة على هذا السؤال، تحتوي على العديد من حاويات IOC بعض تنفيذ حقن خصائص السيطرة ولكن ليس هناك طريقة (حاليا) لخلق الواقع السيطرة من دون منشئ parameterless.

نصائح أخرى

وأونفورتوناتليي ASP.NET لا يبدو لدعم أي من السهل نمط إنشاء مصنع لعناصر. ومع ذلك، في 3.5 الذي يتم إعطاء السيطرة الحبيبات الدقيقة جدا على الرمز الفعلي التي تنشئ وقت التشغيل ASP.NET لملف aspx الخاصة بك.

وببساطة تطبيق [ControlBuilder (...)] سمات لجميع عناصر التحكم التي تريد شيدت من قبل الحاويات الخاصة بك. ControlBuilder فرعية وتجاوز ProcessGeneratedCode لتحل محل منشئ مع دعوة إلى حاوية الخاص بك.

وهنا مثال بسيط:

public class ServiceProviderBuilder : ControlBuilder
{
    public override void ProcessGeneratedCode(System.CodeDom.CodeCompileUnit codeCompileUnit, System.CodeDom.CodeTypeDeclaration baseType, System.CodeDom.CodeTypeDeclaration derivedType, System.CodeDom.CodeMemberMethod buildMethod, System.CodeDom.CodeMemberMethod dataBindingMethod)
    {
        // search for the constructor
        foreach (CodeStatement s in buildMethod.Statements)
        {
            var assign = s as CodeAssignStatement;
            if (null != assign)
            {
                var constructor = assign.Right as CodeObjectCreateExpression;
                if (null != constructor)
                {
                    // replace with custom object creation logic
                    assign.Right = new CodeSnippetExpression("("+ ControlType.FullName + ")MyContainer.Resolve<" + ControlType.BaseType.FullName + ">()");
                    break;
                }
            }
        }
        base.ProcessGeneratedCode(codeCompileUnit, baseType, derivedType, buildMethod, dataBindingMethod);
    }
}    

[ControlBuilder(typeof(ServiceProviderBuilder))]
public partial class WebUserControl1 : System.Web.UI.UserControl
{
    public WebUserControl1()
    {

    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

ونعم يمكنك، أود أن أقترح عليك أن ننظر في spring.net

http://www.springframework.net/doc-latest /reference/html/springair.html

ولست متأكدا إذا كنت تريد أن تبقي على فكرة usercontrol أن كنت يوحي.

وأنا شخصيا استخدام spring.net وnHibernate معا (على الرغم من تجنب قوالب السبات المقدمة حاليا) الذي يعمل بشكل خيالي مع صافي الاشياء بيتا MVC.

وعن طريق Spring.net للتعامل مع nHibernate يقلل قليلا الإدخالات التكوين، وMVC لا يستخدم السياق ملفات XML كنت في حاجة (springair هو مثال جيد).

وحظا سعيدا

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