'Microsoft'에 해당되는 글 27건

  1. 2009.01.05 Silverlight Drag Example
  2. 2008.12.29 VisualTreeHelper 클래스
  3. 2008.12.23 ASP.NET MVC Tutorial #11
  4. 2008.12.17 Silverlight Timer
  5. 2008.12.08 ASP.NET MVC Tutorial #10 1

매우 간단한 드래그 예제입니다.
드래그 할 대상을 클릭할때 초기 Position 값을 설정하고, MouseMove 이벤트가 발생할 때마다 Position 값을 읽어 이전의 값과 차이만큼 Margin을 설정해주는 방법이에요.
참고. CaptureMouse() 메서드가 포인트가 되겠습니다.

        // 이전 마우스 위치
        double oldX;
        double oldY;

        // 현재 마우스 위치
        double newX;
        double newY;

        // 드래그 여부
        bool isDrag = false;

        void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            // Rec_Drag -> Rectangle 로 드래그 대상
            Rec_Drag.MouseLeftButtonDown +=
               new MouseButtonEventHandler(Rec_Drag_MouseLeftButtonDown);
            Rec_Drag.MouseLeftButtonUp +=
               new MouseButtonEventHandler(Rec_Drag_MouseLeftButtonUp);
            Rec_Drag.MouseMove +=
               new MouseEventHandler(Rec_Drag_MouseMove);
        }

        void Rec_Drag_MouseMove(object sender, MouseEventArgs e)
        {
            if (isDrag && Rec_Drag.CaptureMouse())
            {
                newX = e.GetPosition(this).X;
                newY = e.GetPosition(this).Y;

                // 현재값과 이전값의 차이만큼 Margin 설정
                Rec_Drag.Margin =
                   new Thickness(Rec_Drag.Margin.Left + (newX - oldX),
                   Rec_Drag.Margin.Top + (newY - oldY), 0, 0);

                oldX = newX;
                oldY = newY;
            }
        }

        void Rec_Drag_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            isDrag = false;
        }

        void Rec_Drag_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            isDrag = true;

            oldX = e.GetPosition(this).X;
            oldY = e.GetPosition(this).Y;
        }



Posted by glycerine
,

Silverlight 표시 트리에서 자식 개체 또는 부모 개체 축과 함께 개체 관계를 이동하는 데 사용할 수 있는 유틸리티 메서드를 제공합니다.

 DependencyObject do1 = VisualTreeHelper.GetChild(grid_Move, 0);
 grid_Move.Children.RemoveAt(0);
 grid_target.Children.Add(do1 as UIElement);

위 코드는 grid_Move 라는 Grid 컨트롤 자식의 0번째 요소를 grid_target 이라는 Grid 컨트롤로 이동하는 코드입니다.

Posted by glycerine
,

  • Creating a Tasklist Application with ASP.NET MVC
  • Understanding Models, Views, and Controllers
  • Understanding Controllers, Controller Actions, and Action Results
  • Understanding Views, View Data, and HTML Helpers
  • An Introduction to URL Routing
  • Preventing JavaScript Injection Attacks
  • Creating Unit Tests for ASP.NET MVC Applications
  • Using ASP.NET MVC with Different Versions of IIS
  • Creating Custom HTML Helpers
  • Creating Model Classes with LINQ to SQL
  • Displaying a Table of Database Data
  • Creating Page Layouts with View Master Pages
  • Passing Data to View Master Pages
  • Understanding Action Filters

    전 튜토리얼과 비슷한 내용이지만.
    읽어보세요 :)


    Displaying a Table of Database Data

     

    이 튜토리얼에서, 데이터베이스 레코드를 표현하는 두 가지 메소드를 설명할 것입니다. HTML 테이블에서 데이터베이스 레코드의 집합을 두 가지 형식으로 설명할 것입니다. 첫 번째로, view에서 바로 데이터베이스 레코드를 접근하는 것과, 다음으로

     

    Create the Model Classes

     

    Movies 데이터베이스 테이블의 레코드들을 화면에 나타낼 것입니다. Movies 데이터베이스 테이블은 다음과 같은 칼럼으로 구성되어 있습니다.

     

    Column Name

    Data Type

    Allow Nulls

    Id

    Int

    False

    Title

    Nvarchar(200)

    False

    Director

    NVarchar(50)

    False

    DateReleased

    DateTime

    False

     

    Movies 데이터베이스 테이블을 나타내기 위해, 데이터베이스 액세스 기술로 LINQ to SQL을 사용할 것입니다. , LINQ to SQL을 사용하여 MVC model을 구현할 것입니다.

     

    LINQ to SQL 클래스를 만드는 가장 빠른 방법은 Visual Studio Object Relational Designer을 사용하는 것입니다. Model 폴더에서 우 클릭을 한 후, LINQ to SQL 클래스 템플릿을 추가하세요.

     

     

    Movie LINQ to SQL 클래스를 만들고 나면, Object Relational Designer가 나타날 것입니다. 서버 탐색기로부터 데이터베이스 테이블을 Object Relational Designer 로 드래그하세요.

     


     
    기본적으로, Object Relational Designer은 데이터베이스 테이블 이름을 단수형으로 단수 형으로 만듭니다. 예를 들어, Customers 라는 데이터베이스 테이블이 있을 때, 드래그 하여 추가하면 Object Relational Designer Customer라 이름을 만들 것입니다.

     

    Object Relational Designer에서 테이블 이름 변경은 가능합니다.

     

    Using LINQ to SQL in a Controller Action

     

    LINQ to SQL 클래스를 만든 것은, 데이터베이스로부터 데이터를 가져올 클래스가 생겼다는 것입니다. 아래의 코드의 controller 클래스는 Movies 데이터베이스 테이블로부터 movie 레코드를 가져오기 위해 LINQ to SQL 클래스를 사용합니다.

     

    using System.Linq;

    using System.Web.Mvc;

    using MvcApplication1.Models;

     

    namespace MvcApplication1.Controllers

    {

             [HandleError]

             public class HomeController : Controller

             {

                  public ActionResult Index()

                  {

                       var dataContext = new MovieDataContext();

                       var movies = from m in dataContext.Movies

                            select m;

                       return View(movies);

                  }

             }

    }

     

    Index() action은 데이터베이스 테이블로부터 movies을 가져오기 위해 LINQ to SQL MovieDataContext 클래스를 사용합니다. Movies 목록은 ViewData.Model 속성의 값으로 Index view로 전달됩니다.

     

    Formatting within a View

     

    가장 단순하지만, 최고의 방법은 아닌, 데이터베이스 레코드 집합을 형식화 하는 메소드(method of formatting) view에서 바로 데이터를 보여줍니다. 예를 들어, 아래 코드의 Index view HTML 테이블 내에서 movie 데이터베이스 레코드를 렌더링 합니다.

     

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true"

     CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>

    <%@ Import Namespace="MvcApplication1.Models" %>

    <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

     

    <table>

    <tr>

         <th>Id</th><th>Title</th><th>Release Date</th>

    </tr>

    <% foreach (Movie m in (IEnumerable)ViewData.Model)

    { %>

    <tr>

         <td><%= m.Id %></td>

         <td><%= Html.Encode(m.Title) %></td>

         <td><%= m.DateReleased %></td>

    </tr>

    <% } %>

    </table>

     

    </asp:Content>

     

    View은 각각의 movie 레코드를 반복하는 foreach 루프 구문으로 구성되어 있습니다. 각각의 movie 속성 값은 테이블의 각 셀마다 표시됩니다. 테이블 행은 HTML <tr> 태그로 만들고 테이블 셀은 HTML <td> 태그로 만듭니다.

     

    Html.Encode() helper 메소드는 값이 표시되기 전에 각 속성 값을 인코딩 합니다. 사용자 입력 값을 받고, 그 입력 값을 가져와 화면에 표시할 때마다, 자바스크립트 인젝션 공격을 막는 것은 매우 중요합니다.

     

    어플리케이션을 실행 시키면, 아래와 같이 Index view가 렌더링 되어 출력됩니다.

     


     

    그런데, HTML 테이블 형식이 존재하지 않습니다. 그래서 CSS을 사용하여 HTML 테이블의 외관을 향상 시킬 필요가 있습니다.

     

    마스터 페이지의 <head>태그 사이에 다음과 같은 코드를 추가시킵니다.

     

    <style type="text/css">

    table

    {

         border-collapse:collapse;

    }

     

    table td, table th

    {

         border: solid 1px black;

         padding:10px;

    }

    </style>

     

    마스터 페이지에 CSS 코드를 추가한 후, Index view은 다음과 같이 페이지가 보여질 것입니다.


     

     

    Formatting within a Partial

     

    view에서 모든 형식 코드가 동작하기도 하지만, 템플릿으로 특정 부분만 사용할 수도 있습니다. 예를 들어, 다음 코드는 특정 movie 데이터베이스 레코드를 위한 형식입니다. (사용자 정의 컨트롤)

     

    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MovieTemplate.ascx.cs"

     Inherits="MvcApplication1.Views.Movies.MovieTemplate" %>

    <tr>

         <td> <%=ViewData.Model.Id%></td>

         <td> <%=Html.Encode(ViewData.Model.Title)%></td>

         <td> <%=ViewData.Model.DateReleased.ToString("D")%></td>

    </tr>

     

     

    위 코드에서 템플릿은 HTML 테이블의 행으로서 각각 movie 레코드의 형태를 갖추고 있습니다. ViewData.Model 속성은 특정 부분 내에서, 모든 데이터베이스 레코드가 아닌 하나의 데이터베이스 레코드를 나타냅니다.

     

    Movie 클래스의 개체에서 ViewData.Model 속성을 캐스팅하기 위해, 특정 부분을 위한 코드 비하인드 클래스를 만들어야 합니다. 아래 코드에서, 코드 비하인드 클래스는 타입 파라메터로 Movie을 가지고 있는 제네릭 클래스를 상속 받는 MovieTemplate 클래스를 정의하고 있습니다.

     

    using MvcApplication1.Models;

    namespace MvcApplication1.Views.Movies

    {

         public partial class MovieTemplate : System.Web.Mvc.ViewUserControl<Movie>

         {

         }

    }

     

    MovieTemplate 클래스는 ViewUserControl<movie> 클래스를 상속받습니다. MovieTemplate 클래스가 이 클래스를 상속받기 때문에, ViewData.Model 속성은 자동적으로 Movie을 캐스팅합니다.

     

    아래 코드에서 Index viewview에서 MovieTemplate을 어떻게 사용하는지 설명하고 있습니다. Html.RenderPartial() 메소드는 MovieTemplate을 렌더링 하기 위해 사용합니다.

     

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true"

     CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Movies.Index" %>

    <%@ Import Namespace="MvcApplication1.Models" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">

     

    <table>

    <tr>

         <th>Id</th><th>Title</th><th>Release Date</th>

    </tr>

         <% foreach (Movie m in (IEnumerable)ViewData.Model)

         {

              Html.RenderPartial("MovieTemplate", m);  

         } %>

    </table>

     

    </asp:Content>

     

    위 코드에서, Html.RenderPartial() 메소드는 각 Movie 레코드를 나타내기 위해 MovieTemplate을 렌더링 하는데 사용됩니다. 두 파라메터는 RenderPartial() 메소드로 전달합니다. 첫 번째 파라메터는 렌더링 할 템플릿의 이름입니다. 기본적으로, 템플릿은 Views\ControllerName 폴더 또는 Vies\Shared 폴더에 위치되어야 합니다.

     

    두 번째 파라메터는 템플릿에 전달되는 view data 입니다. 템플릿에서, ViewData.Model 속성은 특정 Movie 레코드를 나타냅니다.

     

    하나 중요한 것으로, Html.RenderPartial() 메소드는 다른 Helper 메소드와는 달리, string을 리턴 하지 않는다는 것입니다. 이것은 아래처럼 Renderpartial() 메소드를 호출하지 못한다는 것입니다.

     

    <%= Html.RenderPartial("MovieTemplate", m) %>

     

    아래와 같이 사용해야 합니다.

     

    <% Html.RenderPartial("MovieTemplate", m); %>

     

    RenderPartial() 메소드는 어떤 일, 행동을 의미하는 것이지, 그것을 표현하는 것은 아니다.


  • Posted by glycerine
    ,

    Silverlight 에서 타이머를 만들려면 System.Windows.Threading 네임스페이스의 DispatcherTimer 클래스를 사용합니다.


    1초마다 시간을 업데이트하는 예제.

    Xaml
    <TextBlock x:Name="tbTime" />

    CS

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Threading;

    namespace SLTimer
    {
        public partial class Page : UserControl
        {
            public Page()
            {
                InitializeComponent();

                this.LayoutRoot.Loaded += new RoutedEventHandler(LayoutRoot_Loaded);
            }

            void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
            {
                DispatcherTimer timer = new DispatcherTimer();
                timer.Interval = new TimeSpan(0, 0, 1);
                timer.Tick += new EventHandler(timer_Tick);
                timer.Start();
            }

            void timer_Tick(object sender, EventArgs e)
            {
                tbTime.Text = DateTime.Now.ToString();
            }
        }
    }



    Posted by glycerine
    ,
  • Creating a Tasklist Application with ASP.NET MVC
  • Understanding Models, Views, and Controllers
  • Understanding Controllers, Controller Actions, and Action Results
  • Understanding Views, View Data, and HTML Helpers
  • An Introduction to URL Routing
  • Preventing JavaScript Injection Attacks
  • Creating Unit Tests for ASP.NET MVC Applications
  • Using ASP.NET MVC with Different Versions of IIS
  • Creating Custom HTML Helpers
  • Creating Model Classes with LINQ to SQL
  • Displaying a Table of Database Data
  • Creating Page Layouts with View Master Pages
  • Passing Data to View Master Pages
  • Understanding Action Filters
  • LINQ 부분 정리해서 포스팅한다는게 계속 미뤄지네요.
    지금 튜토리얼은 LINQ에 대한 지식이 약간 필요합니다.

    후반부에 패턴에 대한 이야기가 나오는데. 핵심은 이거네요.
    가져올 데이터베이스 로직을 각 Controller 클래스가 아닌
    데이터베이스 로직에 해당하는
    인터페이스와 클래스를 따로 작성하여 관리하는 효율적인 방법을 제시하였네요.
    아마 많이 쓰는 부분이라 생각드네요.

    Creating Model Classes with LINQ to SQL

     

    이 튜토리얼의 목적은 ASP.NET MVC 어플리케이션에서 model 클래스를 만드는 하나의 메소드를 설명하는 것입니다. 이 튜토리얼에서, LINQ to SQL을 이용하여 어떻게 model 클래스를 빌드하고 데이터베이스에 연결하는지 설명할 것입니다.

     

    예제로, 기본 Movie 데이터베이스 어플리케이션을 만들 것 입니다. 모든 데이터들은 controller actions에 바로 연결할 것입니다.

     

    그리고, Repository 패턴을 어떻게 사용하는지 배울 것입니다. Repository 패턴은 약간의 추가 작업을 필요로 합니다. 그러나, 이 패턴을 사용함으로써 유연한 어플리케이션을 만들 수 있고, 쉽게 테스트 할 수 있습니다.

     

    What is a Model Class?

     

    MVC model MVC view 또는 controller에 포함되지 않은 모든 어플리케이션 로직을 가지고 있습니다. 특히, MVC model은 비즈니스 로직과 데이터 액세스 로직을 가지고 있습니다.

     

    사용자는 데이터 액세스 로직 구현을 위한 다양한 기술들을 적용할 수 있습니다. 예를 들어, Microsoft Entity Framework, NHibernate, Subsonic, 또는 ADO.NET classes 등을 사용함으로써 데이터 액세스 클래스를 만들 수 있습니다.

     

    이 튜토리얼에서는 데이터베이스에 쿼리와 업데이트하기 위해 LINQ to SQL을 사용할 것입니다. LINQ to SQL SQL 데이터베이스와 상호작용하는 간단한 메소드를 제공합니다. 그러나, ASP.NET MVC 프레임워크는 LINQ to SQL에만 한정적 인 것이 아니라, 다른 데이터 액세스 기술과도 잘 융합됩니다.

     

    Creating a Movie Database

     

    이 튜토리얼에서 model 클래스를 어떻게 구성하는 설명하기 위해 간단한 Movie 데이터베이스 어플리케이션을 만들 것입니다. 첫 단계로, 새로운 데이터 베이스를 만듭니다. (아래 표 참고)

     

    Column Name

    Data Type

    Allow Nulls

    Id

    Int

    False

    Title

    Nvarchar(200)

    False

    Director

    Nvarchar(50)

    False

     

     

    Creating LINQ to SQL Classes

     

    MVC model은 데이터베이스 테이블을 의미하는 LINQ to SQL 클래스를 가지고 있어야 합니다. 이 클래스를 만드는 가장 쉬운 방법은 LINQ to SQL 템플릿을 추가 하는 것입니다.

    (Model 폴더 우 클릭 추가 – Linq to sql 템플릿)

     

    LINQ to SQL 클래스를 생성하면, Object Relational Designer 가 나타날 것입니다. 서버 탐색기에서 해당하는 데이터베이스를 Object Relational Designer로 드래그 할 수 있습니다. (아래 그림)

     

     



    기본적으로, Object Relational Designer은 사용자가 드래그 한 데이터베이스 테이블과 같은 이름의 클래스를 만듭니다.

    (저장 필수)


    Using LINQ to SQL in a Controller Action

     

    이 클래스를 만듦으로써, 데이터베이스와 통신할 수 있습니다. 이제, controller action에서 LINQ to SQL 클래스를 어떻게 사용하는지 설명할 것입니다. 우리는 MVC view에서 Movie 데이터베이스 테이블로부터 영화 목록을 보여줄 것입니다.

     

    처음에, HomeController 클래스를 아래 코드와 같이 수정해야 합니다.

     

    주의! Using 네임스페이스.Models

     

    using System.Linq;

    using System.Web.Mvc;

    using MvcApplication1.Models;

     

    namespace MvcApplication1.Controllers

    {

         [HandleError]

         public class HomeController : Controller

         {

              public ActionResult Index()

              {

                   var dataContext = new MovieDataContext();

                   var movies = from m in dataContext.Movies

                        select m;

                   return View(movies);

              }

         }

    }

     

    위 코드에서 Index() action MoviesDB 데이터베이스를 나타내는 LINQ to SQL DataContext 클래스(the MovieDataContext)를 사용합니다. MovieDataContext 클래스는 Visual Studio Object Reletional Designer에 의해 생성되었습니다.

     

    LINQ 쿼리는 데이터베이스 테이블에서 모든 movie와 통신하는 DataContext에 맞게 동작합니다. Movie 목록은 movies 라는 지역 변수에 명명되었습니다. 마지막으로, movie 목록은, view data view에 전달됩니다.

     

    Movie을 보기 위해, Index view 역시 아래 코드로 수정해야 합니다.

     

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true"

       CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>

    <%@ Import Namespace="MvcApplication1.Models" %>

    <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

         <ul>

              <% foreach (Movie m in (IEnumerable)ViewData.Model)

              { %>

                   <li> <%= m.Title %> </li>

              <% } %>

         </ul>

    </asp:Content>

     

    View의 상단에 <%@ import namespace %> 을 포함하는 것을 주의하세요. Model 클래스를 작업하기 위해 이 네임스페이스가 필요합니다.

     

    위 코드에서 view ViewData.Model 속성에 의해 표현될 아이템을 반복하여 보여줄 foreach 루프를 가지고 있습니다. 각 무비의 타이틀 속성이 보여질 것입니다.

     

    ViewData.Model 속성 값은 IEnumerable 로 캐스팅하는 것을 주의하세요. ViewData.Model의 콘텐트를 loop 로 사용하기 위해 필수적입니다.

     

    HomeController 클래스와 Index view을 수정하고 어플리케이션을 실행 시키면, 데이터베이스에 값이 없기 때문에 빈 화면이 나타날 것입니다.

     

    데이터베이스에 값을 넣고 실행시켜 보세요.

     

    Using the Repository Pattern

     

    지금까지, controller action에서 바로 LINQ to SQL 클래스를 사용했습니다. 다시 말해 MovieDataContext 클래스에서 Index() controller action으로 바로 데이터를 넘겼습니다. 간단한 어플리케이션에서는 문제가 없지만, 복잡한 어플리케이션을 만듦에 있어서 controller 클래스 내의 LINQ to SQL 로 바로 작업하는 것은 문제가 생길 수 있습니다.

     

    Controller 클래스에서 LINQ to SQL을 사용하는 것은 차후 데이터 액세스 기술을 변동할 때 어렵습니다. 예를 들어, Microsoft Entity Framework 로 데이터 액세스 기술을 바꾼다고 할 때, 데이터베이스와 연결된 모든 controller을 다시 작성해야 하는 일이 생깁니다.

     

    앞으로의 변화에 더 유연한 MVC 어플리케이션을 만들기 위해서, Repository 패턴을 생각해 볼 수 있습니다. Repository 패턴을 사용할 때, 데이터베이스 액세스 로직을 구성하는 분할된 repository 클래스를 만듭니다.

     

    Repository 클래스에서 사용되는 모든 메소드를 나타내는 인터페이스를 만들어야 합니다. controller에서는 repository가 아닌 인터페이스에 맞는 코드를 작성해야 합니다. 이와 같은 방식으로, repository을 구현할 수 있습니다.

     

    아래 코드에서 IMovieRepository 인터페이스는 IList<Movie>을 리턴하는 하나의 ListAll() 메소드를 가지고 있습니다.

     

    using System.Collections.Generic;

    namespace MvcApplication1.Models

    {

             public interface IMovieRepository

             {

                  IList<Movie> ListAll();

             }

    }

     

    아래 코드에서 repository 클래스는 IMovieRepository 인터페이스를 구현하였습니다. IMovieRepository 인터페이스에 정의된 ListAll 메소드가 구현된 것을 주의하세요.

     

    using System.Collections.Generic;

    using System.Linq;

     

    namespace MvcApplication1.Models

    {

             public class MovieRepository : IMovieRepository

             {

                  private MovieDataContext _dataContext;

     

                  public MovieRepository()

                  {

                        _dataContext = new MovieDataContext();

                  }

     

                  #region IMovieRepository Members

     

                  public IList<Movie> ListAll()

                  {

                       var movies = from m in _dataContext.Movies

                            select m;

                       return movies.ToList();

                  }

     

                  #endregion

             }

    }

     

    마지막으로, 아래 코드의 MoviesController 클래스는 Repository 패턴을 사용하고 있습니다.

     

     

    using System.Web.Mvc;

    using MvcApplication1.Models;

     

    namespace MvcApplication1.Controllers

    {

             public class MoviesController : Controller

             {

                  private IMovieRepository _repository;

     

                  public MoviesController() : this(new MovieRepository())

                  {

                  }

     

                  public MoviesController(IMovieRepository repository)

                  {

                       _repository = repository;

                  }

     

                  public ActionResult Index()

                  {

                       return View(_repository.ListAll());

                  }

             }

    }

     

    위 코드에서 MoviesController은 두 가지 생성자를 가지고 있는 것을 주의해야 합니다. 첫 번째 생성자는, 파라메터가 없는 생성자로서, 어플리케이션이 동작할 때, 호출됩니다. 이 생성자는 MovieRepository 클래스의 개체를 만들고 그것을 두 번째 생성자로 전달합니다.

     

    두 번째 생성자는 IMovieRepository 파라메터 하나를 매개변수로 가지고 있습니다. 이 생성자는 _repository 라는 클래스 단위 필드에 파라메터 값으로 지정합니다.

     

    MoviesController 클래스는 Dependency Injection pattern 이라 불리는 디자인 패턴입니다. 특히, Contructor Dependency Injection 이라 불리는 것을 사용하는 것입니다. 다음 링크에서 이 패턴에 관한 자세한 글을 확인 할 수 있습니다.

     

    http://martinfowler.com/articles/injection.html

     

    MoviesController 클래스의 모든 코드는 실제 MovieRepository 클래스가 아니라 IMovieRepository 인터페이스와 작용합니다. 코드는 구체적인 인터페이스의 구현이 아니라 추상인터페이스 구현입니다.

     

    데이터 액세스 기술을 수정하기를 원한다면 다른 기술을 사용하는 클래스 내의 IMovieRepository 인터페이스를 구현함으로써 적용할 수 있습니다. 예를 들어, EntityFrameworkMovieRepository 클래스나 SubSonicMovieRepository 클래스를 만들 수 있습니다. Controller 클래스가 interface에 맞게 구현하였기에, 새로 구현된 IMovieRepositorycontroller 클래스에 전달하여 계속 작업할 수 있습니다.

    Posted by glycerine
    ,