Могу ли я создавать элементы управления IOC с помощью .NET для размещения в веб-проектах?
-
03-07-2019 - |
Вопрос
В настоящее время у меня есть библиотека 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 - хороший пример).
удачи