2010-12-16 6 views
7

私はIoCを習得し、実際に実践しようとしています。これは私にとって非常に難しいです。ここに私がこれまで持っていたコードがあります。私が作った間違いはありますか?それらを私に指摘すれば、それが実践されたときに実際にどのように適合するかを理解するのに役立ちます。このコードはデカップリングされていますか?

ありがとうございます!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace SharpDIC.Api.Interfaces 
{ 
    interface IDownloader 
    { 
     void DownloadInformation(); 
    } 
} 



using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SharpDIC.Api.Interfaces; 

namespace SharpDIC.Api.Models 
{ 
    public class Member 
    { 
     /******************************************************************************** 
     * Some of these attributes aren't even used. The API doesn't provide them yet, * 
     * so I'll have to scrape the information from the HTML itself. Still thinking * 
     * about how to tackle this.             * 
     *                    * 
     * Author: Sergio Tapia               * 
     * Website: http://www.alphaot.com  
     * Date: 16/12/2010 
     * ******************************************************************************/ 

     #region "Attributes" 
     public string ID { get; set; } 
     public string Name { get; set; } 
     public string Rating { get; set; } 
     public string Photo { get; set; } 
     public string LastActive { get; set; } 
     public string Location { get; set; } 
     public string Birthday { get; set; } 
     public string Age { get; set; } 
     public string Gender { get; set; } 
     public string Email { get; set; } 


     public string Title { get; set; } 
     public string Reputation { get; set; } 
     public string DreamKudos { get; set; } 
     public string Group { get; set; } 
     public string Posts { get; set; } 
     public string PostsPerDay { get; set; } 
     public string MostActiveIn { get; set; } 
     public string JoinDate { get; set; } 
     public string ProfileViews { get; set; } 

     public string FavoriteOs { get; set; } 
     public string FavoriteBrowser { get; set; } 
     public string FavoriteProcessor { get; set; } 
     public string FavoriteConsole { get; set; } 

     public List<Visitor> Visitors { get; set; } 
     public List<Friend> Friends { get; set; } 
     public List<Comment> Comments { get; set; } 
     public string ProgrammingLanguages { get; set; } 

     public string Aim { get; set; } 
     public string Msn { get; set; } 
     public string Website { get; set; } 
     public string Icq { get; set; } 
     public string Yahoo { get; set; } 
     public string Jabber { get; set; } 
     public string Skype { get; set; } 
     public string LinkedIn { get; set; } 
     public string Facebook { get; set; } 
     public string Twitter { get; set; } 
     public string XFire { get; set; } 
     #endregion 
    } 

    public class Comment 
    { 
     public string ID { get; set; } 
     public string Text { get; set; } 
     public string Date { get; set; } 
     public string Owner { get; set; } 
    } 

    public class Friend 
    { 
     public string ID { get; set; } 
     public string Name { get; set; } 
     public string Url { get; set; } 
     public string Photo { get; set; } 
    } 

    public class Visitor 
    { 
     public string ID { get; set; } 
     public string Name { get; set; } 
     public string Url { get; set; } 
     public string Photo { get; set; } 
     public string TimeOfLastVisit { get; set; } 
    } 
} 



using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using SharpDIC.Api.Interfaces; 
using SharpDIC.Api.Models; 

namespace SharpDIC.Api 
{ 
    public class Wrapper : IDownloader 
    { 
     public void DownloadInformation() 
     { 

     } 

     public Member SearchForMember(int memberID) 
     { 
      XDocument response = GetXmlResponse(memberID); 
      //Member then is responsible to parse and fill his contents. 
      Member member = new Member(response); 
     } 
    } 
} 

このコードで何を変更しますか?私はこの権利をしていますか?

編集: DownloadInformation()メソッドは実際に何もしていないことに注意してください。私の意図は、インターフェイスをそのメソッドを持たせることでした。その方法で、XMLから情報を取得できますが、JSONに切り替えることも、プロバイダが今後提供する可能性のあるものにすることもできます。

+1

あなたのコードにはIoCがありません。 – VVS

+0

ありがとう、あなたのコメントは私を大いに助けます。 /秒 –

答えて

3

このコードは何を行う予定ですか?

私はIoCを行う傾向がありますが、私の実装はインターフェイスとは別のアセンブリにあります。ビジネスロジックはインターフェイスとIoCコンテナを参照するだけです(StructureMapは私の選択の武器ですが、自分自身でも手動で行うこともできます)。あなたがこれまでにここに持っているものであることを対比する

  1. あなたの実装では、あなたのインターフェイスとして(と私はアセンブリと仮定)と同じ名前空間にあります。あなたの勤勉さ以外にも、インターフェイスではなく実装からプログラミングを止めることはありません。したがって、結合のリスクは依然として存在します。
  2. 実装には、インターフェイス上にないパブリックメソッドがあります。インタフェースに対してプログラムがこのメソッドを見ることができないものは何でも。システムが成長するにつれ、これは問題ありません。 1つの実装で複数のインタフェースを実装できない理由はありません。インタフェースの分離の原則は、インタフェース自体が理由のために別個で明確である限り、これを可能にします。しかし、そのメソッドが実装の内部的な部分に過ぎない場合は、privateが理にかなっています。

IoCの背後にある基本的な考え方は、クラスをインスタンス化するのではなく、依存関係を提供することです。今はインスタンス化するものがXDocumentMemberのように見えます。前者は、ドメイン(インタフェース)からXML依存関係を引き出すIDownloaderの内部実装の一部であるように見えます。後でXMLの代わりにJSONを処理するIDownloaderの実装を作成することができます。後者はちょうど貧血モデルであるため、インスタンス化は問題ありませんそれ。

IoCの実際の部分は、IDownloaderを使用する場所で、まだ使用されていないようです。

2

セルジオ、

私は変化するであろういくつかのこと(そんなにのIoCに基づいていない - より多くのインタフェース仕様):

interface IDownloader<T> 
{ 
    T DownloadInformation(); 
} 

これは私にはより良い感じ、あなたがしていることを持つことができますあなたの具体的なクラスに実装されています:

public class Wrapper : SharpDIC.Api.Interfaces.IDownloader<string> 
{ 
    public Member SearchForMember(int memberID) 
    { 
     XDocument response = GetXmlResponse(memberID); 
     //Member then is responsible to parse and fill his contents. 
     Member member = new Member(response); 
    } 

    public string DownloadInformation() 
    { 
     throw new NotImplementedException(); 
    } 
} 

明らかに、私は型として '文字列'を使用しましたが、実装に必要な任意のタイプを使用できます。私はまた、IListのにリストを変更したい:

public IList<Visitor> Visitors { get; set; } 
public IList<Friend> Friends { get; set; } 
public IList<Comment> Comments { get; set; } 

だけですべてだという

(結局のところ、我々は:-)インタフェースを議論している)より良い実装の詳細になり - 「聡明」のものとデビッドの答えのお得な情報を(素敵な1デビッド)...

0

(IOCない程度)いくつかの簡単なポイント:

あなたのメンバクラスをリファクタリングする必要があります。

あなたのクラスは、削除または追加IMの種類を(したがって、オープン/クローズの原則を破る)するたびに変更する必要がありそうでないなどのICQ、

移動を代わりにMSNのようなすべてのアドレスのIList<IInstantMessanger>を追加します。お気に入りを別のクラスに追加してIList<>を作成します。同じ理由。

0

エンティティのデータ型について

  • 文字列IDは異なる他のデータ型を使用してみてください - > int型、のGuid
  • 評判 - >は数値ですか? int、float
  • リスト - > IList - >代わりにインターフェイスを使用
関連する問題