Могу ли я создавать элементы управления IOC с помощью .NET для размещения в веб-проектах?

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

Вопрос

В настоящее время у меня есть библиотека UserControls, которую я использую во многих наших веб-приложениях. Я хотел бы обновить эти элементы управления, чтобы я мог использовать IOC для разделения логики.

Так что на самой веб-странице у меня будет что-то похожее на следующее:

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

И элемент управления будет иметь конструктор, похожий на:

public ControlName (IControlLogic logic)

Тогда в идеале контейнер IOC будет обрабатывать инъекцию. Можно ли это сделать? Если да, то какие библиотеки предлагают это? Если у вас есть какие-либо ссылки, о которых вы знаете, которые обсуждают это, они были бы очень благодарны.

Заранее спасибо

Это было полезно?

Решение 3

К сожалению, нет единого ответа на этот вопрос, многие контейнеры IOC содержат некоторую реализацию свойств внедрения элемента управления, но в настоящее время нет способа создать элемент управления без конструктора без параметров.

Другие советы

К сожалению, 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

Я не уверен, хотите ли вы сохранить идею управления пользователями, которую вы предлагаете.

Лично я использую spring.net и nHibernate вместе (хотя избегая предоставляемых в настоящее время шаблонов Hibernate), который фантастически работает с бета-версиями .net MVC.

Использование Spring.net для обработки nHibernate немного уменьшает количество записей конфигурации, а MVC не использует контекст xmls, который вам необходим (springair - хороший пример).

удачи

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top