0

ネストクラスに取り組んでいて、問題に遭遇したとき。その時、誰かが私にインターフェースを使う必要があると言ったのです。インターフェイスを実装する過程で、インターフェイスではコンストラクターや引数パラメーターの受け渡しが許可されていないことを知りました。だから、私は抽象的なことを考えていますが、それらを実装してシンプルに保つことに確信が持てません。

以下のソースコードで。環境設定はコンソール プロジェクトに取り込まれ、DLL プロジェクトのデータベース クラスに渡されます。

質問 #1 - より単純なスクリプトのために環境設定を抽象化することは可能ですか?

質問 2 - ネストされたクラスを使用するかどうか、DealerRepository クラスを保護するにはどうすればよいですか (コンソール プロジェクトから見えないようにしますか? (抽象的だと思います))。

質問 #3 - DealerRepository クラスを抽象化する必要はありますか?

ここで必要なのは、コンソール プロジェクトから DealerRepository クラスを保護/非表示にし、ネスト クラスを介して EnvironmentSetting クラス/モデルを繰り返し渡す必要がないことです。

ありがとう...

 //EnvironmentSetting.cs
 namespace zTestcase1.Model {
   public class EnvironmentSetting : IDisposable
   {
     public EnvironmentSetting() { } //Constructor...
     public void Dispose() { } /Dispose...

     //Member variables...
     private string _emulation = ""; 
     private string _application = "";
     private string _database = "";

     //Get/Set properties...
     public string Emulation { get {return _emulation;} set {_emulation = value;} }
     public string Application { get {return _application;} set {_application = value;} }
     public string Database { get {return _database;} set {_database = value;} }
  }
}

//DealerRepository.cs
namespace zTestcase1.Data.Dealer
{
  public class DealerRepository : IDisposable
  {
    public DealerRepository(EnvironmentSetting parmEnvironmentSetting) {
       _environmentSettingA = parmEnvironmentSetting; 
    } //Constructor...
    public void Dispose() { }  //Dispose...

    //Member variables...
    private EnvironmentSetting _environmentSettingA = "";

    //Get/Set properties...
    //N/A...

    //Functions...
    public string EnvironmentResponse()
    {
        return "Emulation - " + _environmentSettingA.Emulation + ", Application - " + _environmentSettingA.Application + ", Database - " + _environmentSettingA.Database + "";
    }
    public string DealerProifle_Lookup(string parmName)
    {
        return "(DealerProfile-Lookup) - " + parmName;
    }
    public string DealerProfile_Save(string parmName)
    {
        return "(DealerProfile-Save) - " + parmName;
    }
  }
}

namespace zTestcase1.Library
{
  /*public class Database : IDisposable
  {
    //Class...
    public class DataDealer : IDisposable
    {
        //Constructor...
        public DataDealer(EnvironmentSetting parmEnvironmentSetting)
        {
            _environmentSettingA = parmEnvironmentSetting;
        }
        //Dispose...
        public void Dispose() { }

        //Member variables...
        private EnvironmentSetting _environmentSettingA = null;
        private DealerRepository _dataDealer = null;

        //Get/Set properties...
        public DealerRepository Dealer { get { if (_dataDealer == null) { _dataDealer = new DealerRepository(_environmentSettingA); } return _dataDealer; } }

        //Functions...
        //N/A...
    }*/

    //Constructor...
    public Database(EnvironmentSetting parmEnvironmentSetting)
    {
        _environmentSettingB = parmEnvironmentSetting;
    }
    public void Dispose() { } //Dispose...

    //Member variables...
    private EnvironmentSetting _environmentSettingB = null;
    //private DataDealer _dataDealerB = null;
    private DealerRepository _dataDealerC = null;

    //Get/Set properties...
    //public DataDealer Dealer { get { if (_dataDealerB == null) { _dataDealerB = new DataDealer(_environmentSettingB); } return _dataDealerB; } }
    public DealerRepository Dealer { get { if (_dataDealerC == null) { _dataDealerC = new DealerRepository(_environmentSettingB); } return _dataDealerC; } }

    //Functions...
    //N/A...
  }
}

namespace zTestcase1.Sample1.Console
{
  class Program
  {
    static void Main(string[] args)
    {
        EnvironmentSetting environmentSettting = new EnvironmentSetting();
        environmentSettting.Application = "DOS Console";
        environmentSettting.Database = "Not yet hooked up";
        environmentSettting.Emulation = "Development";

        Database _libraryDatabase = new Database(environmentSettting);
        //var test1 = _libraryDatabase.Dealer.Dealer.DealerProifle_Lookup("Best Dealer Cars Buy");
        var test2 = _libraryDatabase.Dealer.DealerProifle_Lookup("Best Dealer Cars Buy");
        System.Console.WriteLine(_libraryDatabase.Dealer.EnvironmentResponse() + " [=] " + test2);
        System.Console.ReadLine(); //To pause the console...

    }
  }
}
4

2 に答える 2

0

回答 #1: 代わりに ...

 //Member variables...
 private string _emulation = ""; 
 private string _application = "";
 private string _database = "";

 //Get/Set properties...
 public string Emulation { get {return _emulation;} set {_emulation = value;} }
 public string Application { get {return _application;} set {_application = value;} }
 public string Database { get {return _database;} set {_database = value;} }

プロパティは、代わりに次のように表現できます ("" への初期化を除いて同等です。代わりに、必要に応じてコンストラクターで実行できます)。

 public string Emulation { get; set; }
 public string Application { get; set; }
 public string Database { get; set; }

回答 2/3: 抽象性と内部クラスは、クラスの可視性を外部の呼び出し元に制限するために使用されません。代わりに使用してくださいinternal。これにより、同じライブラリ内の他のクラスにアクセスできるようになりますが、現在のライブラリの外部からのアクセスは禁止されます。DealerRepositoryただし、この場合、プロパティを介してコンソール アプリケーションからクラスを操作しているように見え_libraryDatabase.Dealerます。ここで何を達成しようとしているのか正確にはわかりません。

于 2013-07-14T19:13:39.730 に答える
0

私があなたを正しく理解していれば、依存性注入が必要です。
これには DI コンテナが必要です。たとえば、MEFを使用すると、コードは次のようになります。

1) アセンブリ "A.dll" (コントラクト):

public interface IEnvironmentSetting
{
    string Emulation { get; }
    string Application { get; }
    string Database { get; }
}

public interface IDealerRepository
{
    string EnvironmentResponse();
    string DealerProifle_Lookup(string parmName);
    string DealerProfile_Save(string parmName)
}

public interface IDatabase
{
    IDealerRepository Dealer { get; }
}

2) アセンブリ "B.dll" (実装):

[Export(typeof(IDatabase))]
public class Database : IDatabase, IDisposable
{
    [Import]
    public IDealerRepository Dealer { get; set; }

    // other code here...
}

[Export(typeof(IDealerRepository))]
public class DealerRepository : IDealerRepository, IDisposable
{
    [Import]
    private IEnvironmentSetting EnvironmentSetting { get; set; }

    // other code here...
}

[Export(typeof(IEnvironmentSetting))]
public class EnvironmentSetting : IEnvironmentSetting, IDisposable
{
    // other code here...
}

3) アセンブリ「C.exe」(コンソール アプリケーション)。「C.exe」からのみアセンブリ「A.dll」を参照する必要があります。

static void Main(string[] args)
{
    using (var catalog = // configure composable part catalog here, read MEF docs to find best way for you)
    using (var container = new CompositionContainer(catalog))
    {
        var database = container.GetExportedValue<IDatabase>();

        // you're working with IDatabase and IDealerRepository here,
        // there's no direct access to the particular implementation classes 
        database.Dealer.DealerProifle_Lookup("Best Dealer Cars Buy");

        // ...
    }
}
于 2013-07-14T20:56:54.190 に答える