1

インターフェイスを使用して生産性と拡張性を高めようとしています。それらは非常に強力ですが、理解または実装のいずれかで問題が発生しました。

仮説として、私が制御できないユーザー インターフェイスがあるとします。しかし、一連のロジックを実行するクラス ライブラリを作成しています。私の当初の考えは次のようなものでした:

public interface ISiteForm
{
     public string FirstName { get; set; }
     public string LastName { get; set; }

     // Also any other User Interface Form Fields.
}

これはこのようにレイアウトされるため、User Interfaceによって実装および参照できます。

public class SiteForm : ISiteForm
{
    public SiteForm()
    {
        FormPass();
    }

    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    public string LastName
    {
         get { return lastName; }
         set { lastName = value; }
    }

    private string lastName,
    private string firstName,

    public void FormPass(string _lastName, string _firstName)
    {
        // Implementation to assign a value from User Interface into the interface.

        lastName = _lastName;
        firstName = _firstName;
    }
}

私の考えでは、クラス ライブラリが参照されたときに、メソッドが呼び出されたときにそれらのパラメーターがメソッドに渡されます。次に、クラスが作成されたときに自然に。これらの変数をインターフェイスに割り当てます。

したがって、同じ変数を必要とするプロジェクトの他の部分があったとします。インターフェイスを呼び出してセッター値を調整するだけです。

私の懸念は次のとおりです。

  • 本質的にインターフェースはロジックを期待していません
  • それらは通常ポリモーフィックであり、その特定の実装が失われます。

同じ変数を他の場所で使用できるように、インターフェイスを介してパラメーターを渡すための間違ったアプローチですか?

4

4 に答える 4

1

インターフェイスには何も割り当てません。これは実装契約です。実装クラスにはすべてのロジックが含まれています。

同じインターフェースと変数を使用したい場合は、依存性注入や制御の反転などを検討することをお勧めします。

于 2013-03-06T17:08:14.663 に答える
1

インターフェースは、ポリモーフィズム以外の目的ではありません。それらにロジックを入れてはいけません。

于 2013-03-06T17:08:43.413 に答える
1

同じ変数を他の場所で使用できるように、インターフェイスを介してパラメーターを渡すための間違ったアプローチですか?

オブジェクト インスタンスと型宣言を混同しないように注意してください。タイプのローカル変数はISiteForm、それが宣言されているブロックでアクセスできます。例えば、

public void M()
{
    ISiteForm s = new SiteForm();
}

として宣言sした場合、変更によってオブジェクト インスタンスがプログラムの他の部分からアクセス可能にSiteFormなることはありません。s

インターフェイスを使用すると、オブジェクトの基になる型に関係なく、オブジェクトを一様に扱うことができます。

例えば

public void M(ISiteForm s)
{
    var propertyName = s.FirstName;
}

sここでは、 が の型であるSiteFormか、たまたま を実装する他の型であるかはわかりませんISiteForm。動作は多態的です。

これはこのようにレイアウトされるため、ユーザー インターフェイスによって実装および参照できます。

その時点まで、インターフェイスを使用して n 層アーキテクチャのレイヤーを分離できます。たとえば、Interfaces.dll を作成できます。この DLL は、ISiteForm. ユーザー インターフェイスとビジネス ロジックの両方が、この共有 DLL を参照できます。この設計により、無関係なオブジェクトをレイヤー間で受け渡しできるようにすることで疎結合が可能になり、循環参照を回避するのに役立ちます。

于 2013-03-06T17:33:06.810 に答える
0

提案に基づいて、解決策を再検討しました。これが私がそれを処理した方法です。依存性注入: インターフェース注入アプローチを使用しました。この方法論は、私が必要としていた分離アプローチを提供しました。機能の目標を維持しながら。

私は以下を作成しました:

public interface ISiteForm
{
     string GetSiteValues(string FirstName, string LastName);
}

この特定のインターフェイスは、依存関係またはとして機能しますIDependency。次に、以下を作成しましたClass

public class SiteForm : ISiteForm
{
    // Leave for now.
}

Interfaceこの時点で、とを事前に構成しましClassた。これはDependencyとして機能します。

次に、インジェクターをセットアップします。

public interface ISiteFormInjector
{
    void InjectSiteForm(ISiteForm siteDetails);
}

インジェクターはDependentまたはこの場合は になりますIDependent。ここで、データ インジェクションが物理的に実装されるように、コードを更新する必要があります。

public class SiteContent : ISiteFormInjector
{
    // Call our Dependency.
    ISiteForm _siteDetails;

    public void InjectSiteForm(ISiteForm siteDetails)
    {
         _siteDetails = siteDetails;
    }

    // Properties to Associate our Value.
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string GetSiteValues()
    {
        return _siteDetails.GetSiteValues(FirstName, LastName);
    }
}

これで、値を注入できます。明らかに、いくつかのリファクタリングにより、値を注入して、それらの変数をアプリケーションの他の側面に渡すことができます。次の形式のレイアウトに従います。

インターフェイス注入用の UML

于 2013-03-06T22:06:05.193 に答える