2008年10月17日 星期五

自訂 assembly 的位置

http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx  中有描述當CLR程式執行時,載入 assembly 的順序。
因此,可以使用如下的設定,讓程式執時,除了搜尋執行程式的路徑外,也能搜尋自訂的路徑

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="myBin"/>
    </assemblyBinding>
  </runtime>
</configuration>
以上程式執時,會搜尋 .\myBin 下的所有assembly

WSDL 的主機名稱換成 host name

在取得 web service 的 WSDL 時,發生了一個怪現象

例如, 我要取得 http://server1.domain.com.tw/service1/myService.svc?wsdl,但在其內容,卻包含下面這一段

<xsd:import namespace="http://tempuri.org/" schemalocation="http://host1/service1/myService.svc?xsd=xsd0" />

注意到 server1.domain.com.tw 是對外的 FQDN,而 host1 是該台機器的 host name。

但,host1 對於外部來說,是不可解析的。 怎麼辦呢?

又爬了文,找到 http://blogs.msdn.com/wenlong/archive/2007/08/02/how-to-change-hostname-in-wsdl-of-an-iis-hosted-service.aspx

原來,只需要在 IIS 中設網站的識別碼,如下圖。

image 

按確定後,記得要 IISReset

2008年10月7日 星期二

OOAD(7): 常見的 check

繼承是因為行為發生變化

如果不是行為發生變化,就不值得繼承

善用適合的類別作為屬性

如果子類別只是較父類別多了一些屬性,而非行為發生變化,則可考慮使用Dictionay 作為屬性,而不要子類別了。

舉例來說,下面的程式是不好的。

class Parent
{
   public string Name;
   public void Fly();
}

class Child1 : Parent
{
   public string Color;
   public string AliasName;
}

class Child2 : Parent
{
   public string BackColor;
}

class Child3 : Parent
{
   public string BorderColor;
}

原因是 Child1, Child2, Child3 在行為上根本不會發生變化。還是只有 Parent 的Fly。因此,只需要修改成下面的程式,就不需要子類別了。

class Parent
{
   public string Name;
   public void Fly();
   public Dictionary  OtherProperties {get; set;}
}

2008年10月5日 星期日

Visual Studio 2010

雖然 VS2010看來還要很久才會到來,但有些功能我卻是迫不及待。以下是部份的功能

  • 支援UML
    • Activity Diagram
    • Component Diagram
    • Layer Diagram
    • Logical Class Diagram
    • Sequence Diagram
    • User Case Diagram
  • Requirements management
  • Buttom up design / Top-Down design
  • support .net framework 4.0
  • Layer diagram
  • Debug history
  • jQuery support

2008年10月2日 星期四

ADO.NET Data Service 與 LINQ to SQL

今天在第一次測試時,碰到這樣的訊息

問題

The server encountered an error processing the request. See server logs for more details.

image

測試的過程是這樣的

  1. 建立一個 Web application
  2. 建立一個 Linq to sql dbml file,上頭拖了一個 Company 的 table
  3. 建立一個 ADO.NET Data Service,並修改名稱為 Service.svc
  4. 修改 Service.svc.cs 如下
    public class Service : DataService
    {
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        }
    }

解決

頁面上什麼也沒有,只有這一行字。Google了一下。原來加上一行 attribute 即可
[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
    public class Service : DataService
    {
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        }
    }

image

意思是 Company 沒有key

所以在dbml 上加上 partial class, code 如下

  [DataServiceKey("OID")]
  partial class Company
  {
  }
如此一來就解決了問題。

2008年10月1日 星期三

OOAD(6): textual analysis

Textual analysis

  1. 在use case 中尋找名詞與動詞,可用來尋找 class 及其 method
  2. 一個好的 use case 應該精準並清楚地描述系統行為,並容易了解。因此,進行 textual analysis 是快速而容易的。
  3. 當一個 use case 無法或不容易進行 textual analysis 時,就應該進行重寫來重新描述。
  4. 注意到名詞與動詞並非一定是 class 與 method,常常需要逐字檢查。例如「飛機進行轟炸」,不注意的話會以為進行是動詞,而把轟炸當名詞。與客戶重新確認後,發現是客戶描述不正確。經修改後的use case 就會改成「飛機轟炸都市」,就會產生 飛機.轟炸(都市) 的結果。
  5. 即使名詞經分析後並未成為我們需要的 class ,也需要注意。因為這個名詞通常也可能是 actor。

Textual analysis 完畢後,接著可進行更新類別圖 (class diagram)

OOAD(5): Design Principles

Avoid duplicate code

當發現重複的程式碼片斷時,通常代表「設計」有問題。例如責任放錯了類別,或者是否應該delegate到別的類別等等。

Encapsulate what varies

Code to an interface rather than an implementation

Each class in your should have only one reason to change

Classes are about behavior and fuctionlity

在系統中的每個物件只有單一的責任

Share with Facebook