Sto aggiornando del codice per permetterci di implementare i test unitari. Quello che ho finora è un Business Layer che chiama il repository per ottenere dati dal database.
Esempio di livello aziendale:
public class ConversationLogic
{
private IConversationData _conversationData { get; set; }
public ConversationLogic(IConversationData conversationData)
{
_conversationData = conversationData;
}
public ConversationListModel GetConversations(int loginID)
{
ConversationListModel model = new ConversationListModel();
dynamic list = _conversationData.GetConversations(loginID);
foreach (var item in list)
{
ConversationModel conversation = ConvertConversation(item);
model.Conversations.Add(conversation);
}
return model;
}
}
Ciò consente l'inoltro di un'interfaccia di ConversationData, questo ConversationData è il livello del repository che chiama il database.
Esempio di archivio dati conversazione:
public class ConversationData : BaseMassiveTable, IConversationData
{
public dynamic GetConversations(int loginID)
{
string sql = GetResourceFile("Project.SQL.GetConversations.sql", Assembly.GetExecutingAssembly());
dynamic result = Query(sql, loginID).ToList();
return result;
}
}
Il ConversationData eredita dalla classe BaseMassive, che implementa IDisposable:
public class BaseMassiveTable : DynamicModel, IDisposable
{
string connectionName;
public BaseMassiveTable(string connectionStringName, string tableName, string primaryKeyColumn) :
base(connectionStringName, tableName, primaryKeyColumn)
{
connectionName = connectionStringName;
}
public void Dispose()
{
}
protected void WriteErrorToFile(int userId, string url, Exception ex)
{
try
{
string path = "~/Error/" + DateTime.Today.ToString("yyyy-MM-dd") + ".txt";
if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(path)))
{
File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close();
}
using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path)))
{
w.WriteLine("\r\nLog Entry : ");
w.WriteLine("{0}", DateTime.Now.ToString(CultureInfo.InvariantCulture));
string err = "Error in: " + url +
". Error Message:" + ex.Message;
w.WriteLine(err);
w.WriteLine(ex.StackTrace.ToString());
w.WriteLine("__________________________");
w.Flush();
w.Close();
}
}
catch
{
//What do we do here ????
}
}
public string Truncate( string stringForTuncation, int maxLength)
{
string result = "";
if (stringForTuncation == null)
{
result = null;
}
else if (stringForTuncation.Length <= maxLength)
{
result = stringForTuncation;
}
else
{
result = stringForTuncation.Substring(0, maxLength);
}
return result;
}
public static string GetResourceFile(string name, Assembly assembly)
{
using (Stream stream = assembly.GetManifestResourceStream(name))
{
using (StreamReader reader = new StreamReader(stream))
{
string result = reader.ReadToEnd();
return result;
}
}
}
}
Come puoi vedere nella mia implementazione di ConversationLogic, non riesco a racchiudere l'interfaccia IConversationData in un utilizzo in quanto ciò non funziona con l'implementazione corrente.
Che cosa vedrai anche in ConversationData.GetConversations (), questo chiama la Massive ORM Query (), che assomiglia a questa:
public virtual IEnumerable<dynamic> Query(string sql, params object[] args)
{
using (var conn = OpenConnection())
{
var rdr = CreateCommand(sql, conn, args).ExecuteReader();
while (rdr.Read())
{
yield return rdr.RecordToExpando(); ;
}
}
}
Quello che sto cercando è che, anche se ConversationData eredita da BaseMassive, che implementa IDisposable, devo effettivamente racchiudere tutte le chiamate usando IConversationData nell'utilizzo delle istruzioni, poiché ogni chiamata al repository chiama l'istruzione Massive Query (), che gestisce le proprie risorse creando un'istruzione using () su qualsiasi query?
Chiedo scusa per la domanda prolissa, se hai bisogno di chiarimenti, fammelo sapere.