잊지 않겠습니다.

WCF Attribute

데이터 계약에서 사용되는 Attribute : Class, structure, enum 형태에 모두 적용되어야지 된다.
  • [DataContract] : WCF 서비스에 사용될 데이터임을 명시한다.
  • [DataMember] : Serialization될 데이터들을 명시
  [DataContract]
  public class Product
  {
    [DataMember] public string Name;
    [DataMember] public string ProductNumber;
    [DataMember] public string Color;
    [DataMember] public string ListPrice;
  }
서비스 계약에서 사용되는 Attribute : interface로 제공된다.
  • [ServiceContract] : Service 계약에서 사용될 Interface를 명시
  • [OperationContract] : Service 계약에서 사용될 method를 명시

  [ServiceContract]
  public interface IProduct
  {
    [OperationContract]
    List<string> ListProducts();

    [OperationContract]
    Product GetProduct(string productNumber);

    [OperationContract]
    int CurrentStockLevel(string productNumber);

    [OperationContract]
    bool ChangeStockLevel(string productNumber, int newStockLevel, string shelf, int bin);
  }

interface와 데이터 계약에서 계약된 데이터를 이용해서, Service를 구현시켜준다.

  public class ProductServiceImpl : IProduct
  {
    private static WCFProduct.Datas.AdventureWorksDataContext dataContext;

    static ProductServiceImpl()
    {
      dataContext = new WCFProduct.Datas.AdventureWorksDataContext();
    }

    public List<string> ListProducts()
    {     
      return ( from p in dataContext.Products select p.ProductNumber ).ToList<string>();     
    }

    public Product GetProduct(string productNumber)
    {
      var productData = (from p in dataContext.Products where p.ProductNumber == productNumber select p).FirstOrDefault();
      Product product = new Product()
      {
        Name = productData.Name,
        ProductNumber = productData.ProductNumber,
        Color = productData.Color,
        ListPrice = productData.ListPrice.ToString()
      };
      return product;
    }

    public int CurrentStockLevel(string productNumber)
    {
      List<ProductInventory> productData = ( from p in dataContext.ProductInventories
                          join pr in dataContext.Products on p.ProductID equals pr.ProductID
                          select p ).ToList<ProductInventory>();

      return productData.Count;
    }

    public bool ChangeStockLevel(string productNumber, int newStockLevel, string shelf, int bin)
    {
      var productData = from p in dataContext.ProductInventories
                        join pr in dataContext.Products on p.ProductID equals pr.ProductID
                        where pr.ProductNumber == productNumber && p.Shelf == shelf &&
                        p.Bin == bin
                        select p;
      foreach ( ProductInventory p in productData )
      {
        p.Quantity = (short) newStockLevel;
      }

      dataContext.SubmitChanges();

      return true;
    }
  }

   

WCF Service의 구현 : WebService

*.svc 파일에 Service에 대한 연결 구현

<%ServiceHost Service = "Products.ProductsServiceImpl" %>

web.config에 Service에 대한 binding 옵션 추가
 <system.serviceModel>
  <services>
   <service name="WCFProduct.ProductServiceImpl" behaviorConfiguration="ProductsBehavior">
    <endpoint address="" binding="basicHttpBinding" contract="WCFProduct.IProduct"/>
   </service>
  </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ProductsBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
 </system.serviceModel>
  • Service에 대한 이름과 행동(behaviorConfiguration)을 추가시켜준다.
  • HttpGet을 얻기 위해 httpGetEnable을 true로 만들어주면, WebService와 동일하게 get을 통해 wsdl 문서를 얻을 수 있다.

   

SOA와 WCF

Network의 Resorce로 이루어지는 SOA는 독립적으로 서비스가 가능하며, 구현 기술에 관련없이 접근할 수 있다. 주된 장점은 특정 Platform이나 위치에 독립적인 solution을 만들수 있다는 것이다. 이를 지키기 위해서는 SOA의 4가지 원칙에 준수한 서비스를 만들어야지 된다.

경계가 뚜렷해야지 된다.

서비스가 요청을 어떻게 처리할지나 클라이언트가 요청에 대한 응답을 어떻게 다룰지에 대한 어떠한 가정을 해서는 안된다.

이 원칙은 서비스와 클라이언트간의 종속성을 최대한으로 줄일 수 있는 방법이 된다.

서비스는 자율적이 되어야지 된다.

하나 이상의 서비스가 사용될 수 없는 상황에서도 실행이 가능하도록 이러한 변화에 견딜 수 있도록 솔루션이 느슨하게 결합되도록 설계되어야지 된다.

서비스는 Class나 Type이 아닌 스키마와 계약으로 공유되어야지 된다.

서비스는 시간이 갈수록 변화되고 진화할 수 있다. 그리고 서비스의 새로운 버젼은 이전 버젼을 대신할 수 있어야지 된다. 서비스가 업데이트 되면 기존의 클라이언트와의 호환성을 유지하기 위해서 기존 계약을 계속 구현해야지 되고, 기존 스킴에 맞게 메세지를 보낼 수 있어야지 된다.

호환성은 정책에 기반한다.

서비스에 의해 드러나는 스킴과 계약은 서비스의 형태를 정의하지만 클라이언트가 서비스에 접근하기 위해서 만족시켜야지 되는 비기능적 요구사항은 반영하지 않는다. 보안 요구사항 등의 접속 방법들은 정책으로 구현하고, 정책 요구 사항이 구현 형태에 종속되지 않게 서비스를 설계해야지 하고 클라이언트는 서비스가 요구하는 어떤 정책이든 준수해야지 된다.   


WCF Attribute

데이터 계약에서 사용되는 Attribute : Class, structure, enum 형태에 모두 적용되어야지 된다.
  • [DataContract] : WCF 서비스에 사용될 데이터임을 명시한다.
  • [DataMember] : Serialization될 데이터들을 명시
  [DataContract]
  public class Product
  {
    [DataMember] public string Name;
    [DataMember] public string ProductNumber;
    [DataMember] public string Color;
    [DataMember] public string ListPrice;
  }
서비스 계약에서 사용되는 Attribute : interface로 제공된다.
  • [ServiceContract] : Service 계약에서 사용될 Interface를 명시
  • [OperationContract] : Service 계약에서 사용될 method를 명시

  [ServiceContract]
  public interface IProduct
  {
    [OperationContract]
    List<string> ListProducts();

    [OperationContract]
    Product GetProduct(string productNumber);

    [OperationContract]
    int CurrentStockLevel(string productNumber);

    [OperationContract]
    bool ChangeStockLevel(string productNumber, int newStockLevel, string shelf, int bin);
  }

interface와 데이터 계약에서 계약된 데이터를 이용해서, Service를 구현시켜준다.

  public class ProductServiceImpl : IProduct
  {
    private static WCFProduct.Datas.AdventureWorksDataContext dataContext;

    static ProductServiceImpl()
    {
      dataContext = new WCFProduct.Datas.AdventureWorksDataContext();
    }

    public List<string> ListProducts()
    {     
      return ( from p in dataContext.Products select p.ProductNumber ).ToList<string>();     
    }

    public Product GetProduct(string productNumber)
    {
      var productData = (from p in dataContext.Products where p.ProductNumber == productNumber select p).FirstOrDefault();
      Product product = new Product()
      {
        Name = productData.Name,
        ProductNumber = productData.ProductNumber,
        Color = productData.Color,
        ListPrice = productData.ListPrice.ToString()
      };
      return product;
    }

    public int CurrentStockLevel(string productNumber)
    {
      List<ProductInventory> productData = ( from p in dataContext.ProductInventories
                          join pr in dataContext.Products on p.ProductID equals pr.ProductID
                          select p ).ToList<ProductInventory>();

      return productData.Count;
    }

    public bool ChangeStockLevel(string productNumber, int newStockLevel, string shelf, int bin)
    {
      var productData = from p in dataContext.ProductInventories
                        join pr in dataContext.Products on p.ProductID equals pr.ProductID
                        where pr.ProductNumber == productNumber && p.Shelf == shelf &&
                        p.Bin == bin
                        select p;
      foreach ( ProductInventory p in productData )
      {
        p.Quantity = (short) newStockLevel;
      }

      dataContext.SubmitChanges();

      return true;
    }
  }

   

WCF Service의 구현 : WebService

*.svc 파일에 Service에 대한 연결 구현

<%ServiceHost Service = "Products.ProductsServiceImpl" %>

web.config에 Service에 대한 binding 옵션 추가
 <system.serviceModel>
  <services>
   <service name="WCFProduct.ProductServiceImpl" behaviorConfiguration="ProductsBehavior">
    <endpoint address="" binding="basicHttpBinding" contract="WCFProduct.IProduct"/>
   </service>
  </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ProductsBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
 </system.serviceModel>
  • Service에 대한 이름과 행동(behaviorConfiguration)을 추가시켜준다.
  • HttpGet을 얻기 위해 httpGetEnable을 true로 만들어주면, WebService와 동일하게 get을 통해 wsdl 문서를 얻을 수 있다.

   

SOA와 WCF

Network의 Resorce로 이루어지는 SOA는 독립적으로 서비스가 가능하며, 구현 기술에 관련없이 접근할 수 있다. 주된 장점은 특정 Platform이나 위치에 독립적인 solution을 만들수 있다는 것이다. 이를 지키기 위해서는 SOA의 4가지 원칙에 준수한 서비스를 만들어야지 된다.

경계가 뚜렷해야지 된다.

서비스가 요청을 어떻게 처리할지나 클라이언트가 요청에 대한 응답을 어떻게 다룰지에 대한 어떠한 가정을 해서는 안된다.

이 원칙은 서비스와 클라이언트간의 종속성을 최대한으로 줄일 수 있는 방법이 된다.

서비스는 자율적이 되어야지 된다.

하나 이상의 서비스가 사용될 수 없는 상황에서도 실행이 가능하도록 이러한 변화에 견딜 수 있도록 솔루션이 느슨하게 결합되도록 설계되어야지 된다.

서비스는 Class나 Type이 아닌 스키마와 계약으로 공유되어야지 된다.

서비스는 시간이 갈수록 변화되고 진화할 수 있다. 그리고 서비스의 새로운 버젼은 이전 버젼을 대신할 수 있어야지 된다. 서비스가 업데이트 되면 기존의 클라이언트와의 호환성을 유지하기 위해서 기존 계약을 계속 구현해야지 되고, 기존 스킴에 맞게 메세지를 보낼 수 있어야지 된다.

호환성은 정책에 기반한다.

서비스에 의해 드러나는 스킴과 계약은 서비스의 형태를 정의하지만 클라이언트가 서비스에 접근하기 위해서 만족시켜야지 되는 비기능적 요구사항은 반영하지 않는다. 보안 요구사항 등의 접속 방법들은 정책으로 구현하고, 정책 요구 사항이 구현 형태에 종속되지 않게 서비스를 설계해야지 하고 클라이언트는 서비스가 요구하는 어떤 정책이든 준수해야지 된다.   


Posted by Y2K
,

MS의 SOA에 대한 기본 Framework.

Solution의 설계 및 다양한 기술을 적용할 수 있는 지속적인 모델을 제시

  • WebService
  • COM+
  • MSMQ
  • .NET Framework remoting

과 같은 서비스의 일괄적인 통합 및 구축 개발 방법 

WCF 1.0
  • HTTP
  • TCp
  • Peer network
  • IPC(inter-process communication over named pipes)
  • MSMQ
Posted by Y2K
,
  1. lock
  2. Monitor
  3. System.Threading.Interlocked
    • Increment() : 증가
    • Decrement() : 감소
    • Exchange() : 교환
    • CompareExchange() : 같은지 검사후, 같은 경우 3번째의 값으로 값을 변경시켜준다.
  4. [Synchronization] 속성을 이용한 동기화
    • Class의 속성으로 설정
    • 해당 객체의 모든 맴버를 Thread에 안전하게 잠그게 된다.
    • 모든 맴머가 잠기게 되기 때문에 기능성이 심하게 저하될 수 있다
  5. AutoEvent, ManualEvent를 이용한 동기화
  6. Process간 통신을 위한 Mutex와 Semaphore
Posted by Y2K
,