2010-02-10 6 views
2

ASP.NET 사용자 정의 컨트롤을 만들고 여러 매개 변수를 통해 컨트롤을 만들 수있는 메서드를 사용하여 팩터 리를 만들고 싶습니다.사용자 정의 컨트롤 팩토리 패턴

원래 매개 변수를 사용하여 사용자 정의 컨트롤에 생성자를 지정하려고했으나 매개 변수는 실제로 변경하지 않으려는 일부 레거시 코드에서 사용자 정의 컨트롤을 쉽게 만들 수 있도록 제공되었습니다. 레거시 코드에서 사용할 수있는 팩토리 클래스에 메서드를 추가하고 싶다고 결심했습니다. 그런 식으로 사용자 컨트롤 인터페이스를 방해하지 않습니다.

문제는 factory 클래스에서 사용자 정의 컨트롤 클래스를 참조 할 수 없다는 것입니다. 일반적으로 <%@ Reference Control="~/SomeControl.ascx" %>을 추가하여 사용자 정의 컨트롤을 프로그래밍 방식으로 참조하지만 팩터 리 클래스는 ASP 페이지가 아닙니다.

사이드 페이지에서 호출 페이지가 자체에 대한 참조를 전달하도록하여 공장 메서드가 LoadControl을 호출 할 수 있도록했지만 여전히 SomeControl 변수를 선언 할 수 있어야합니다.

사용자 정의 컨트롤을위한 팩토리는 어떻게 만듭니 까?

+1

팩토리 메소드는 페이지를 매개 변수로 취할 수 있으며 팩토리는 loadcontrol을 사용하여 사용자 정의 컨트롤의 인스턴스를 생성 할 수 있어야합니다. 그러면 컨트롤이 페이지의 controls 컬렉션에 팩토리를 추가 할 수 있어야합니다. 메서드는 새로 만든 사용자 정의 컨트롤 인스턴스에 대한 참조를 반환하여 호출 페이지에 추가로 사용할 수 있도록합니다. 당신은이 모든 일들에 대해서 이야기 한 것처럼 보이므로, 문제의 어떤 부분이 실제로 당신을 기분 전환시키고 있는지 명확하지 않습니다. 더 자세한 내용을 포함 할 수 있습니까? 아니면 코드를 작성할 수 있습니까? –

+1

저는 그가 웹 사이트 (Web App Project가 아니라)를 개발하고 있다고 생각합니다. 팩토리 메서드는 Website 코드가 컴파일되고 참조되는 방식 때문에 SomeControl 클래스를 사용할 수 없습니다. 템플릿 코드는 App_Code와 별도로 컴파일됩니다 (처음 요청시 가능). 템플릿 어셈블리는 App_Code 어셈블리에 따라 달라지며 그 반대의 경우는 아닙니다. –

+0

gWiz가 맞습니다. 심지어 인식되지 않기 때문에 컴파일 오류없이 SomeControl 변수를 선언 할 수도 없습니다. 폼의 동적 특성 때문에 선언적으로보다는 프로그래밍 방식으로 SomeControl 인스턴스를 많이 만들려고합니다. – AaronLS

답변

1

선언적 프로그래밍 (사용자 컨트롤이 설계된)은 명령형 개체 생성으로 잘 변환되지 않습니다. 레거시 코드에서 SomeControl을 더 쉽게 사용할 수 있도록 해주는 어댑터 사용자 정의 컨트롤 (또는 서버 컨트롤)을 만들지 않겠습니까? 다음과 같이. SqlDateTime과 관련하여 많은 로직을 가진 레거시 페이지가 있다고 가정하고 평범한 DateTime과 관련하여 작업을 수행하는 새로운 컨트롤을 작성합니다.

LegacyPage.aspx :

<%@ Page Language="C#" AutoEventWireup="true" %> 
<%@ Register Src="~/SomeControlLegacyAdapter.ascx" TagName="SomeControlLegacyAdapter" TagPrefix="test" %> 
<script type="text/C#" runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     SomeControlLegacyAdatper1.Time = new System.Data.SqlTypes.SqlDateTime(DateTime.Now); 
    } 
</script> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <test:SomeControlLegacyAdapter runat="server" ID="SomeControlLegacyAdatper1" /> 
    </div> 
    </form> 
</body> 
</html> 

SomeControlLegacyAdapter.ascx

<%@ Control Language="C#" AutoEventWireup="true" %> 
<%@ Import Namespace="System.Data.SqlTypes"%> 
<%@ Register Src="~/SomeControl.ascx" TagPrefix="test" TagName="SomeControl" %> 

<script type="text/C#" runat="server"> 
    public SqlDateTime Time 
    { 
     get { return SomeControl1.Time; } 
     set { SomeControl1.Time = (DateTime)value; } 
    } 
</script> 

<test:SomeControl ID="SomeControl1" runat="server" /> 

SomeControl.aspx

<%@ Control Language="C#" AutoEventWireup="true" %> 
<script type="text/C#" runat="server"> 
    public DateTime Time 
    { 
     get { return string.IsNullOrEmpty(output.Text) ? DateTime.MinValue : DateTime.Parse(output.Text); } 
     set { output.Text = value.ToString(); } 
    } 
</script> 

<asp:Literal runat="server" id="output" /> 

는 레거시 어댑터는 LegacyPage 소비하기 쉽게 형태로 SomeControl 변환합니다.