Question

I'm trying to implement N-layer architecture to my project first time.

I created BLL, DAL and GUI

Here is in 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);

here is in 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; }  
}

and here is in 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; }
}

so, in GUI, naturally it needs to add DAL as reference because I derived NewDictionary from IDictionary that is in DAL. But I want to seperare GUI and DAL each other.

apart from creating an IDictionary object, how can I do it? I hope the question is clear

Was it helpful?

Solution

Under the condition that neither can reference each other, and no 3rd party reference of contracts; the only logical solution is to deal with it as a change in domain. You could use a DataContract and a DataContractSerialiser to help you.

Serialiser borrowed from here

    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);
        }
    }

here you have effectively the same object defined in (pretend) two libraries.. FooA and 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);

    }

Look up Windows Communication Foundation

A data contract is a formal agreement between a service and a client that abstractly describes the data to be exchanged. That is, to communicate, the client and the service do not have to share the same types, only the same data contracts. A data contract precisely defines, for each parameter or return type, what data is serialized (turned into XML) to be exchanged.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top