1

初めてプロジェクトにN層アーキテクチャを実装しようとしています。

BLL、DAL、GUIを作成しました

これがGUIです

XmlSettingsBLL xmlSettings = new XmlSettingsBLL();

  var newDict = new NewDictionary()
  {
   StrDataSourceType = "AccessMdb",// DataSourceType.AccessMdb,
   DictionaryID = Guid.NewGuid().ToString(),
   FirstColumnName = "Kelime",
   SecondColumnName = "Karsilik",
   TableName = "kelimelerpro",
   LastShowedID = 0,
   Name = "kpds",
   Path = "kelimeler.mdb"
  };

  xmlSettings.AddNewDictionary(newDict);

ここはBLLです

public bool AddNewDictionary(NewDictionary list)
{
list.DatasourceType = (DataSourceType)Enum.Parse(typeof (DataSourceType), list.StrDataSourceType);

IDictionaryList newDictionary =list;

try
{
   helper.AddDictionary(newDictionary);
   return true;
}
catch
{
  return false;
}      
}

 public class NewDictionary : IDictionaryList
{
    public string Name { get; set; }
    public string Path { get; set; }
    public string DictionaryID { get; set; }
    public string TableName { get; set; }
    public int LastShowedID { get; set; }
    public string FirstColumnName { get; set; }
    public string SecondColumnName { get; set; }
    public DataSourceType DatasourceType { get; set; }
    public string StrDataSourceType { get; set; }  
}

そしてここにDALがあります

 public void AddDictionary(IDictionaryList list)
 {
   var channelElem = xdoc.Element("MemorizeSettings");
   var dictionaries = channelElem.Element("Dictionaries"); 

   XAttribute[] attrs = new XAttribute[8];
   attrs[0] = new XAttribute("Name", list.Name);
   attrs[1] = new XAttribute("Path", list.Path);
   attrs[2] = new XAttribute("TableName", list.TableName);
   attrs[3] = new XAttribute("DatasourceType", Enum.GetName(typeof(DataSourceType),list.DatasourceType));
   attrs[4] = new XAttribute("LastShowedID", "0");
   attrs[5] = new XAttribute("FirstColumnName", list.FirstColumnName);
   attrs[6] = new XAttribute("SecondColumnName", list.SecondColumnName);
   attrs[7] = new XAttribute("DictionaryID", list.DictionaryID);

   var newdict = new XElement("Dictionary", attrs);

   dictionaries.Add(newdict);
   xdoc.Save(fileName);
 }

public interface IDictionaryList
{
     string Name { get; set; }
     string Path { get; set; }
     string DictionaryID { get; set; }
     string TableName { get; set; }
     int LastShowedID { get; set; }
     string FirstColumnName { get; set; }
     string SecondColumnName { get; set; }
     DataSourceType DatasourceType { get; set; }
}

したがって、GUIでは、DALにあるIDictionaryからNewDictionaryを派生させたため、当然、参照としてDALを追加する必要があります。しかし、GUIとDALを分離したいと思います。

IDictionaryオブジェクトを作成する以外に、どうすればよいですか?質問が明確であることを願っています

4

1 に答える 1

1

どちらも相互に参照できず、第三者が契約を参照できないという条件の下で。唯一の論理的な解決策は、ドメインの変更としてそれを処理することです。DataContractとDataContractSerialiserを使用して支援することができます。

ここから借りたシリアライザー

    public static string Serialize(object obj)
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
            serializer.WriteObject(memoryStream, obj);
            return Encoding.UTF8.GetString(memoryStream.ToArray());
        }
    }

    public static object Deserialize(string xml, Type toType)
    {
        using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
        {
            XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
            DataContractSerializer serializer = new DataContractSerializer(toType);
            return serializer.ReadObject(reader);
        }
    }

ここでは、2つのライブラリで(ふりをして)定義された同じオブジェクトが事実上あります。FooAとFooB

    [DataContract(Name="Foo")]
    public class FooA
    {
        [DataMember] 
        public int Value;
    }

    [DataContract(Name = "Foo")]
    public class FooB
    {
        [DataMember]
        public int Value;
    }

    static public void Main()
    {
        var fooA = new FooA() {Value = 42};

        var serialised = Serialize(fooA);

        // Cross domain

        var fooB = (FooB) Deserialize(serialised, typeof(FooB));

        Console.WriteLine(fooB.Value);

    }

WindowsCommunicationFoundationを検索する

データコントラクトは、交換されるデータを抽象的に記述する、サービスとクライアント間の正式な契約です。つまり、通信するために、クライアントとサービスは同じタイプを共有する必要はなく、同じデータコントラクトのみを共有します。データコントラクトは、パラメーターまたはリターンタイプごとに、交換するためにシリアル化される(XMLに変換される)データを正確に定義します。

于 2013-03-09T11:55:31.827 に答える