1

私はこのパターンを研究していて、メソッドを実行したいのですが、これらのパラメーター化されたコンストラクターは私には非常に複雑に見えるため、メソッドを呼び出す方法がわかりません。私がフォローしているコードは、2つのインターフェースと2つのクラスで構成されています。以下はサンプルコードです。「TestMethod()」の呼び出し方を教えてください。可能であれば、誰かが次の目標を達成するのを手伝ってくれるでしょう。

  1. 「TestMethod()」を呼び出します。
  2. このパターンとその重要性を説明してください。(単純さがより良い場合は、それらを単純化する方法を助けてください)。
  3. コンストラクターがパラメーター化される理由を説明します。(単純さがより良い場合は、それらを単純化する方法を助けてください)。

コンソールアプリケーション

 class Program
    {
        private static IPropertyService _property;
        public Program(IPropertyService property)
        {
            _property = property;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Enter something...");
            _property.TestMethod(Console.ReadLine());
            Console.ReadLine();
        }
        public interface IPropertyService
        {
            string TestMethod(string strParam);
        }

        private class PropertyService : IPropertyService
        {
            private readonly IPropertyRepository _propertyRepository;

            public PropertyService(IPropertyRepository propertyRepository)
            {
                _propertyRepository = propertyRepository;
            }
            public string TestMethod(string strParam)
            {
                return _propertyRepository.TestMethod(strParam);
            }
        }
    }

    public interface IPropertyRepository
    {
        string TestMethod(string strParam);
    }
    public class PropertyRepository : IPropertyRepository
    {
        public string TestMethod(string strParam)
        {
            return string.Format("You have entered: {0}", strParam);
        }
    }
4

1 に答える 1

1

プログラムはエントリポイントクラスです。パラメータ化されたコンストラクタにしないでください。動作しません。

public Program(IPropertyService property)

IPropertyServiceプライベート静的メソッドとして定義する必要はありません。Mainメソッド内でローカルに宣言すれば問題ありません。

static void Main(string[] args)
{
    Console.WriteLine("Enter something...");
    IPropertyService _property = //to be added;
    _property.TestMethod(Console.ReadLine());
    Console.ReadLine();
}

//to be addedそれでは、このセクションについて話しましょう。

この場合、これまでのところ最も簡単な解決策は、AbstractFactoryを使用することです。手動コーディングの例:

public class PropertyServiceFactory{
  public IPropertyService Create(){
    IPropertyRepository repository = new PropertyRepository();
    PropertyService service = new PropertyService(repository);
    return service; 
  }
}

実装:

Console.WriteLine("Enter something...");
PropertyServiceFactory factory = new PropertyServiceFactory();
IPropertyService _property = factory.Create();
_property.TestMethod(Console.ReadLine());

ただし、PropertyServiceFactoryとPropertyRepositoryの間の依存関係を解消する場合は、ファクトリを次のように変更します。

public class PropertyServiceFactory{
  private readonly IPropertyRepository _repository;
  public PropertyServiceFactory(IPropertyRepository repository){
    _repository = repository
  }
  public IPropertyService Create(){
    PropertyService service = new PropertyService(_repository);
    return service; 
  }
}

これにより、PropertyServiceFactoryとPropertyRepositoryを分離しました。実装は次のとおりです。

Console.WriteLine("Enter something...");
IPropertyRepository repository = new PropertyRepository();
PropertyServiceFactory factory = new PropertyServiceFactory(repository);
IPropertyService _property = factory.Create();
_property.TestMethod(Console.ReadLine());

マーク・シーマンのクレジット

于 2013-03-21T08:58:35.353 に答える