Mitt inlägg i debatten.
Tjenare.
Då Gladh sagt åt mig ett flertal gånger att jag ska använda mig av ORMapper så har jag tagit åt mig ORMappern som Paul Wilson skapat.
Jag tänkte använda den på följande sätt i mina kommande projekt.
- DL
-- Databas
- DAL
-- Mitt DataAccessLayer som jag använder om jag vill fylla mina object med lite mer avancerade SQL-satser.
Detta lager använder jag mindre för att mer o mer gå över till ORMappern
- ORMappern
-- Min ORMapper som fyller mina object eller collectioner.
- BOL
-- Mitt BusinessObjectLayer där alla object och entiter finns.
- BLL
-- Mitt BusinessLogicLayer där jag fyller alla mina BusinessObjects Med hjälp av antingen ORMappern eller mitt DAL.
- PL
-- Mitt PresentationLayer där jag binder all min data till olika kontoller i antingen en aspx eller winform.
Där har ni min lösning. Nu till lite kod, databasen behöver man inte visa...och min DAL ser nog lite ut som alla andras.
Den returnerar dem vanliga sakerna(datareader, datasets osv osv) mer hur jag använder den senare.
Sen mitt BOL så har jag t.ex följande
[red]
using System;
using icaaq.wf.business;
using System.Configuration;
using Wilson.ORMapper;
namespace icaaq.wf.businessObjects
{
public class TblSeller
{
private int pkSellerId;
private DateTime fldDate;
private int fldContact;
public int PkSellerId
{
get { return this.pkSellerId; }
}
public DateTime FldDate
{
get { return this.fldDate; }
set { this.fldDate = value; }
}
public int FldContact
{
get { return this.fldContact; }
set { this.fldContact = value; }
}
public int Add()
{
ObjectSpace myORLogic = new ObjectSpace(ConfigurationSettings.AppSettings["ObjectMapping"], ConfigurationSettings.AppSettings["ConnectionString"], Provider.Access);
TblSeller s = (TblSeller)myORLogic.GetObject(typeof(TblSeller));
s.FldContact = this.fldContact;
s.FldDate = this.fldDate;
myORLogic.PersistChanges(s);
return s.pkSellerId;
}
}
}
[/red]
TblSeller har ORMappern skapat mha ORHelpern som mappar upp hela databasen och även skapar de olika objekten. Det jag har lagt till i classen TblSeller är alltså Add() funktionen (Vilken man kanske kan snygga till ytterligare) Men jag tycker att den funktionen snabbar upp kodningen i mitt PL.
Om vi sen går vidare till BL så har jag där först en konstuktor
[red]
public class Logic
{
private ObjectSpace myORLogic;
private OdbcData myDataLogic;
public Logic(ConnectionType cType)
{
switch(cType)
{
case ConnectionType.ORMapper:
myORLogic = new ObjectSpace(ConfigurationSettings.AppSettings["ObjectMapping"], ConfigurationSettings.AppSettings["ConnectionString"], Provider.Access);
break;
case ConnectionType.DataAccessLayer:
myDataLogic = new OdbcData(ConfigurationSettings.AppSettings["ConnectionString2"]);
break;
}
}
..
..[/red]
Där jag väljer om jag ska använda mig av ORMappern eller mitt DAL. Sedan om jag använder mig av ORMappern så ser det t.ex ut så här
[red]
public ICollection GetAllProvinces()
{
return myORLogic.GetCollection(typeof(ArrayList), typeof(TblProvince), string.Empty);
}
public ICollection GetNeighbourProvince(int SelectedProvince)
{
QueryHelper Helper = myORLogic.QueryHelper;
string where = Helper.GetExpression("pk_ProvinceId in (SELECT fldNeighbourProvince from tblProvinceNeighbour where fldSelectedProvince = "+SelectedProvince.ToString()+")");
return myORLogic.GetCollection(typeof(ArrayList), typeof(TblProvince), where);
}
[/red]
Eller om jag använder mitt DAL
[red]
public ArrayList GetSearch(string SearchWord, int Category, int Province, bool Neighbour, int Size, int type)
{
string SqlStatement = "SELECT pk_ArticleId, fldDate, fldHeadline, fldContent, fldPicture, fldProvinceName, fldcategoryName " +
"FROM ((tblSeller AS s "+
"INNER JOIN tblArticle AS a ON a.fk_SellerID=s.pk_SellerId) "+
"INNER JOIN tblProvince AS p ON p.pk_ProvinceID=s.fldProvince) "+
"INNER JOIN tblCategories AS c ON c.pk_CategoryId=a.fk_CategoryId "+
"WHERE (a.fldHeadline LIKE '%"+ SearchWord +"%' OR a.fldContent LIKE '%"+ SearchWord +"%') "+
"AND a.fldSellingType = "+type.ToString()+" ";
if(Category != -1)
{
SqlStatement += "AND a.fk_CategoryId = "+Category +" ";
}
if(Province != -1)
{
if(Neighbour)
{
SqlStatement += "AND (s.fldProvince IN (SELECT fldNeighbourProvince from tblProvinceNeighbour where fldSelectedProvince = "+Province.ToString()+") OR s.fldProvince = "+Province.ToString()+") ";
}
else
{
SqlStatement += "AND s.fldProvince = "+Province.ToString()+" ";
}
}
Debug.WriteLine(SqlStatement);
OdbcDataReader dr = myDataLogic.RetriveDataReader(SqlStatement);
ArrayList aCollection = new ArrayList();
while(dr.Read())
{
Article a = new Article();
a.Id = Convert.ToInt32(dr["pk_ArticleId"]);
a.FullDate = Convert.ToDateTime(dr["fldDate"]);
a.Headline = Convert.ToString(dr["fldHeadline"]);
a.Content = Convert.ToString(dr["fldContent"]);
a.Province = Convert.ToString(dr["fldProvinceName"]);
a.Category = Convert.ToString(dr["fldCategoryName"]);
if(Convert.IsDBNull(dr["fldPicture"]))
{
a.Picture = false;
}
else
{
a.Picture = true;
}
aCollection.Add(a);
}
dr.Close();
return aCollection;
}
[/red]
Nu har jag bara mitt PL kvar och där binder jag ju bara de olika collectionerna som jag hämtat från mitt Logic Layer. Samt att jag sparar datasom jag fått in genom att t.ex göra följande
[red]
private void addSellerClick(object sender, System.EventArgs e)
{
TblSeller s = new TblSeller();
s.FldProvince = Convert.ToInt16(this.province.SelectedItem.Value);
s.FldName = this.nameBox.Text;
s.FldEmail = this.mailBox.Text;
s.FldPhone = this.phoneBox.Text;
s.FldDate = DateTime.Now;
s.FldContact = Convert.ToInt16(this.contactThru.SelectedItem.Value);
this.sid.Text = [b]s.Add()[/b].ToString();
this.article.Visible = true;
this.LoadCategories();
}
[/red]
Det är här jag bara anropar s.Add() för att spara mitt nya object och den i sin tur använder ORMappern för att spara objectet.
Det blev ju ganska mycket kod i detta inlägg men jag hoppas att jag kan få lite åsikter på hur jag byggt upp det hela.
mv icaaq