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

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

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

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

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

public ControlName (IControlLogic logic)

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

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

Ответы [ 3 ]

2 голосов
/ 04 марта 2009

Unfortunatley 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)
    {

    }
}
1 голос
/ 05 января 2009

Да, можно, я бы посоветовал взглянуть на spring.net

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

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

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

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

удачи

0 голосов
/ 05 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...