2015-04-22 6 views
3

Я работаю над несколько расширенной пользовательской структурой для некоторых веб-сайтов, которые я разрабатываю на работе, и я внедряю для нее небольшую систему плагинов. Я хочу каким-то образом зарегистрировать плагины в файле ASPX, чтобы потом я мог подключаться к различным событиям страницы (Load, PreRender и т. Д.) После вызова их последовательно в моей функции Page_Init, например. Я буду прыгать прямо в коде, так что вы видите, что я хочу сделать:Создать настраиваемую директиву ASP.NET (не MVC)?

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<%@ Plugin TypeName="MyFramework.Plugin.Core" Arg1="arg1" Arg2="arg2" %> 
<%@ Plugin TypeName="MyFramework.Plugin.MainMenu" Arg1="arg1" Arg2="arg2" %> 
<%@ Plugin TypeName="MyFramework.Plugin.IE6Hacks" Arg1="arg1" Arg2="arg2" %> 
<%@ Plugin TypeName="MyFramework.Plugin.Footer2015" Arg1="arg1" Arg2="arg2" %> 
<%@ Plugin TypeName="MyFramework.Plugin.SortableGridViews" Arg1="arg1" Arg2="arg2" %> 

<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>blah</title> 
</head> 
<body>  
    <form id="form1" runat="server"> Blah... </form> 
</body> 
</html> 

См эти <% Plugin %> директив? они не существуют в ASP.NET, но я хочу их создать. Я ничего не могу найти в Google относительно этого материала. Можно ли создать пользовательский?

Моя идея состоит в том, что как только они будут «зарегистрированы» с этими директивами, я могу пропустить их все (хранится в массиве каждый раз при ударе директивы или в событии Page_Init) и действовать соответствующим образом.

Еще одна идея у меня было использовать блоки кода вместо:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<% RegisterPlugin("MyFramework.Plugin.Core"); %> 
<% RegisterPlugin("MyFramework.Plugin.MainMenu"); %> 
<% RegisterPlugin("MyFramework.Plugin.IE6Hacks"); %> 
<% RegisterPlugin("MyFramework.Plugin.Footer2015"); %> 
<% RegisterPlugin("MyFramework.Plugin.SortableGridViews"); %> 

<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>blah</title> 
</head> 
<body>  
    <form id="form1" runat="server"> Blah... </form> 
</body> 
</html> 

НО функции вызываются после всех страниц событий вместо запуска перед ними (или, по крайней мере, до Page_Load), не оставляя меня нет способ обнаружения, если у меня есть плагины, зарегистрированные для того, чтобы действовать соответственно в событиях Page_Load моей базовой страницы и т. д.

Любые идеи действительно оценены :). Заранее спасибо!

ответ

3

Парсер страницы ASP.NET не поддерживает настраиваемые директивы (хотя он поддерживает пользовательские атрибуты в директиве Page или MasterPage). Но вы все еще можете делать то, что хотите, используя серверные элементы управления.

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

// we derive from control, so all plugins are automatically 
// added to the Page.Controls collection 
public class MyPluginBase : Control 
{ 
} 

И, например, два плагин классы, как это:

public class MyPlugin : MyPluginBase 
{ 
    public string MyFirstProperty { get; set; } 
    public int MySecondProperty { get; set; } 
} 

public class MyOtherPlugin : MyPluginBase 
{ 
    public string MyFirstProperty { get; set; } 
    public int MySecondProperty { get; set; } 
} 

Тогда вы можете написать веб-форму ASPX (или ASCX) следующим образом:

<%@ Page ... standard attributes ... %> 

<plugins:MyPlugin runat="server" MyFirstProperty="blah" MySecondProperty="1"></plugins:MyPlugin> 
<plugins:MyOtherPlugin runat="server" MyFirstProperty="blahblah" MySecondProperty="2"></plugins:MyOtherPlugin> 

etc... 

Примечание: для этого вам нужно будет объявить префикс плагинов где-нибудь, для Пример в web.config, как это:

<configuration> 
    <system.web> 
    <pages> 
     <controls> 
     <!-- all assemblies & namespaces that contain plugins classes --> 
     <add assembly="WebApplication1" namespace="WebApplication1.Code" tagPrefix="plugins" /> 
     <add assembly="MyOtherPlugins" namespace="MyOtherPlugins.Plugins" tagPrefix="plugins" /> 
     </controls> 
    </pages> 
    </system.web> 
</configuration> 

А в коде позади класса, вы будете иметь автоматический доступ к плагинам, во всех мероприятиях, в том числе Init, с помощью следующего кода:

public partial class WebForm1 : Page 
{ 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     // get all plugins on the page 
     var plugins = Controls.OfType<MyPluginBase>(); 
    } 
} 
+0

Там вы идете, вот как вы можете это сделать DARKGuy.Щедрость, отнятая All Star снова (LOL). Хороший вопрос и отличный ответ. –

0

Используйте контейнер для инъекций, например Autofac, который поддерживает WebForms.

Возможно, вас заинтересует использование типов отношений Enumeration или Metadata Integerrogation, чтобы выполнить регистрацию/разрешение плагина.

Вы также можете найти сцепление с использованием MEF с помощью WebForms. WebForms and MEF Sample