webForumDet fria alternativet

Gör om gör rätt, eller?

.NET

90 svar · 3 348 visningar · startad av thevice · sida 2 av 5

Frågan, av thevice

Hejsan, Jag gick över från ASP till .NET för nästan ett år sen, jag började att göra ett community så jag skulle lära mig grunderna i .NET då jag tycker att det är ett bra sätt att lära sig på. Communityt var från början bara något som jag skulle göra för att lära mig och sedan "skrota" det. Problemet ligger nu att det börjar bli seriöst. Sidan är gjord nu i MySQL och koden var något som jag trod

Läs frågan i sin helhet →
Medlem sedan juli 20011 304 inlägg
#21

inspiro skrev:

Näe, klarnar inte. :) Förstår inte vinsten riktigt... jag ser bara ett extra lager som borde påverka prestandan negativt?

Ta ett enkelt exempel, jag vill veta hur många olästa mail kalle har och skriva ut det på sidan. På ett eller annat sätt måste jag ju hämta det från databasen och det är sql-frågan som gör jobbet. Vad tjänar jag på att ha en entitetklass som inte innehåller så mycket mer än en variabel som jag kan sätta/hämta, jag måste ju ändå vidare och peka på min stored procedure någonstans?

Det du tjänar på att ha klasser som databärare är att du kan använda objektorientering fullt ut. Det handlar om att dela upp koden i logiska delar med bestämda ansvarsområden och uppgifter. Istället för att duplicera koden för att hämta lästa mail eller i bästa fall bryta ut den i en funktion lägger du ansvaret där det logiskt hör hemma. Det finns så många skäl till att göra det att det inte får plats i denna tråd.

Angående prestandan: om man har sådana problem med prestandan att något så mikroskopiskt litet påverkar har man förmodligen enorma problem någon annan stans. Däremot vinner man i läsbarhet, åtvervinnbarhet osv.

Medlem sedan jan. 20022 440 inlägg
#22

Hittade faktiskt lite tänkvärd läsning från microsoft det står egentligen inte hur man ska gå tillväga men det är tänkvärd läsning som gör att man förstår lagren lite bättre.

http://msdn2.microsoft.com/en-us/library/ms978496.aspx, den går även tanka hem som pdf.

Medlem sedan dec. 19996 522 inlägg
#23

Catz, vidare läsning under ledigheten kanske kan bli http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672 , en mycket bra bok som fortsätter på det Jon pratar om

Medlem sedan jan. 20022 440 inlägg
#24

erka skrev:

Catz, vidare läsning under ledigheten kanske kan bli http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672 , en mycket bra bok som fortsätter på det Jon pratar om

Aaaaah äntligen ett vettigt boktips som går på djupet!

Tack ska du ha, den är beställd! Fler tips? :e

Medlem sedan dec. 19996 522 inlägg
Medlem sedan dec. 2005198 inlägg
#26

Satte mig härom dan och försökte mig på det här med DAL nu. Jag vet inte om jag har fattat det rätt eller är koden helt åt skogen?
I mitt csproj gjorde jag fyra mappar:
- Entities
- DAL
- BLL
- UI

Sedan så testade jag att göra ett nyhets arkiv. Jag är fortfarande fundersam på hur jag ska döpa sakerna, nu så heter allt samma. Men iaf, så här gjorde jag:
NewsDetails.cs (Försökte göra något med namnet så att inte allt skulle blir news.)

namespace LinkopingLife.Entities
{
	public class NewsDetails
	{
		public NewsDetails() { }
		public NewsDetails(int id, string title, string text, DateTime date)
		{
			this.ID = id;
			this.Title = title;
			this.Text = text;
			this.Date = date;
		}

		private int _id = 0;
		public int ID
		{
			get { return _id; }
			set { _id = value; }
		}

		private string _title = "";
		public string Title
		{
			get { return _title; }
			set { _title = value; }
		}

		private string _text = "";
		public string Text
		{
			get { return _text; }
			set { _text = value; }
		}

		private DateTime _date = DateTime.Now;
		public DateTime Date
		{
			get { return _date; }
			set { _date = value; }
		}
	}
}

News.cs (Funderar på att döpa den här till t.ex NewsProvider.cs, rätt eller fel?)

namespace LinkopingLife.DAL
{
	public class News
	{
		public List<NewsDetails> GetAllNews()
		{
			using (IDbCommand objCommand = new MySqlCommand())
			{
				objCommand.CommandText = "SELECT intID, strTitle, txtText, dtmNow FROM tblForumThreads WHERE intForumID = 16";

				using (DataTable dataTable = new DataAccess().ExecuteDataTableResult(ConfigurationManager.AppSettings["DatabaseConnection"], objCommand))
				{
					List<NewsDetails> newsList = new List<NewsDetails>();

					foreach (DataRow objDataRow in dataTable.Rows)
					{
						NewsDetails news = new NewsDetails();
						news.ID = Convert.ToInt32(objDataRow["intID"]);
						news.Title = Convert.ToString(objDataRow["strTitle"]);
						news.Text = Convert.ToString(objDataRow["txtText"]);
						news.Date = Convert.ToDateTime(objDataRow["dtmNow"]);

						newsList.Add(news);
					}
					return newsList;
				}
			}
		}
	}
}

News.cs

namespace LinkopingLife.BLL
{
	public class News
	{
		public List<Entities.NewsDetails> GetAllNews()
		{
			DAL.News dal = new DAL.News();
			return dal.GetAllNews();
		}
	}
}

NewsArchive.aspx.cs (Anledningen till att den heter Archive är att på den här sidan ska jag hämta ut alla nyheter. Sen så vill jag kunna hämta ut den nyaste nyheten på start sidan sen.)

namespace LinkopingLife.UI
{
	public partial class _NewsArchive : System.Web.UI.Page
	{
		protected Repeater repNews;
		protected void Page_Load(object sender, EventArgs e)
		{
			BLL.News bll = new BLL.News();
			List<Entities.NewsDetails> newsList = bll.GetAllNews();
			repNews.DataSource = newsList;
			repNews.DataBind();
		}
	}
}

Tänkte gå vidare nu med att hämta den senaste nyheten och efter ID. Men först vill jag se om jag har gjort rätt eller fel, och framför allt vad som kan förbättras. Sedan så har jag inte kommit fram till än hur jag ska göra med parametrarna. Det lättaste vore väll att skicka med värdena från UI till BLL. Sedan från BLL till DAL där jag sätter parametrarna, eller?

Medlem sedan maj 20012 812 inlägg
#27

Jag tycker du börjar få kläm på det hela...

En sak som jag dock tycker du skall tänka på är att de kommer bli en massa mappande från DataTable till dina entiteter. Och det är här O/R Mappern kommer in om man använder en sådan, så skulle du iprincip kunna ta bort hela ditt DAL och använda en ORMapper istället direkt från ditt BLL, ta en titt på NHibernate, det är väl den "stora" oramappern som de flesta använder.

Om du vill fortsätta använda ditt eget DAL så tycker jag du skall läsa här:
http://www.webforum.nu/showthread.php?t=163666 som visar hur du kan skapa en generics mappning från din datatable till dina entiteter utan att behöva skriva koden för varje entitet hela tiden.

List<NewsDetails> newsList = new List<NewsDetails>();
foreach (DataRow objDataRow in dataTable.Rows)
{
	NewsDetails news = new NewsDetails();
	news.ID = Convert.ToInt32(objDataRow["intID"]);
	news.Title = Convert.ToString(objDataRow["strTitle"]);
	news.Text = Convert.ToString(objDataRow["txtText"]);
	news.Date = Convert.ToDateTime(objDataRow["dtmNow"]);
	newsList.Add(news);
}

Kan ändras till

List<News> newsList = new EntityMapper.Map<News>(dataTable);

Dessutom så tror jag inte du behöver dela upp ditt BLL i specifika classer för varje entitet, tror knappast att ditt projekt blir så stort så det behövs. Ut allt som har med affärslogik att göra lägger du i ETT businesslager som sedan anropar ditt DAL, likadant här tror jag inte du behöver ett DAL för varje entitet, utan du skapar ett stort DAL. Eller ännu bättre, tar bort DAL:et och använder en ORMapper som fungerar som ditt dal.

- M

Medlem sedan dec. 2005198 inlägg
#28

Tack så mycket, jag vet faktiskt inte hur jag ska göra när det gäller en ORMapper. Jag ställde frågan i huvud inlägget om jag inte minns fel så jag trodde att ett DAL va lösningen.
Har läst mycket gott om ORMapper men jag har aldrig förstått mig på det, blir det inte svårt med joins osv då? Det verkar ju mycket enklare att slippa göra entiteter och DAL. Men det känns väldigt svårt.

Sen vet jag inte vad jag ska välja mellan det som du skrev i din tråd eller NHibernate? Vad är bäst, smidigast osv?

Vad menas med ett stort projekt? Jag tycker att mitt projekt är stort, men det kan iof vara för att jag inte har gjort något annat i mitt liv som är större. Det känns ju ny mycket smidigare att köra på NHibernate och sköta allt från BLL. Men din artikel känns mycket bättre. Jag vet inte hur jag ska göra, hjälp. :)

Medlem sedan dec. 19996 522 inlägg
#29

Inget är bäst eller smidigast, det beror på din situation. De flesta OR-mappers kräver att du mappar upp dina entiteter i exempelvis XML-filer, vilket kan vara ett mödosamt jobb. Personligen gillar jag NHibernate, HQL (Hibernate Query Language) är mycket kraftfullt men det är också ett stort steg. Det är ett stort stort språng mellan att tänka objektorienterad när man skriver frågor till hql, om man är van vid sql. Men det är bara avancerade frågor som kräver HQL, det mesta går att ordna med det enklare ICriteria. Har du mappat upp dina relationer i mappningsfiler sköter Hibernate skapandet av alla sql-frågor on the fly, så joins behöver du inte bry dig om speciellt ofta.

Ett alternativ om du vill slippa mappningsfiler, vilket i början kan vara ganska krångligt, speciellt olika typer av relationer och jag tänker då speciellt på bags och sets i hibernate kan active record från castle projekt kanske vara ett alternativ. Där markerar du dina entiteter med attribut på klasser och properties hur de representeras i databasen. Personligen tycker jag inte information om hur objektet ska sparas har att göra på domänobjekt/entitet men i vissa projekt duger det nog allt ;)

Det smidigare är väll att använda DataSets, men det är ju inte rätt speciellt ofta :)

Har du tid och ork tycker jag du ska kolla in hibernate, det utvecklas av många personer och har en stor användarskara, nackdelen är att nhibernate släpar lite från hibernate, men det som kommer i hibernate kommer i slutänden med i nhibernate också. Det är ju en java or/mapper från början men fått en .net portning.

Medlem sedan sep. 2005673 inlägg
#30

Vad menas med "mappa"?

Medlem sedan dec. 2005198 inlägg
#31

Jag har länge suttit och funderat på NHibernate, men jag har aldrig vågat ta det steget. Har inte hittat några vettiga artiklar bara nybörjar artiklar och det tycker jag sitter. Men om det är som du säger att det bara är att mappa relationer mellan mappningsfilerna för att fixa joins osv så borde jag börja kolla på det.
Men sen är ju frågan vad jag tjänar mest på i längden? NHibernate med BLL och UI. Eller ett DAL? Någon som sitter inne på ett kod exempel på hur NHibernate fungerar i lite större syfte?

Medlem sedan juli 20011 304 inlägg
#32

inspiro skrev:

Vad menas med "mappa"?

Att beskiva hur objekten förhåller sig till en relationsdatabas och hur relationerna mellan dem ser ut. Även nycklar och cascading-regler brukar beskrivas.

O/R mappern använder sedan informationen för att generera sql och bygga ihop objekten.

Mappningen sker oftast i en xml-fil men kan även besktivas med attribut på objekten.

Medlem sedan juli 20011 304 inlägg
#33

thevice skrev:

Jag har länge suttit och funderat på NHibernate, men jag har aldrig vågat ta det steget. Har inte hittat några vettiga artiklar bara nybörjar artiklar och det tycker jag sitter. Men om det är som du säger att det bara är att mappa relationer mellan mappningsfilerna för att fixa joins osv så borde jag börja kolla på det.
Men sen är ju frågan vad jag tjänar mest på i längden? NHibernate med BLL och UI. Eller ett DAL? Någon som sitter inne på ett kod exempel på hur NHibernate fungerar i lite större syfte?

Jag är av åsikten att i ett större samanhang ska det helst inte spela någon roll om man använder NHibernate, Ett eget DAL, LINQ to sql, NPersist eller vad man kan komma på utan applikationen skall vara designad så att den möter de krav man har ställt på den. Oftast är det att den skall vara skalbar, testbar, utbytbar osv. Det vill säga: titta på exempel på arkitekturer du är intresserad av, läs t.ex på om ddd om det tilltalar dig, eller soa eller vad du nu har valt. (Det känns på typen dina frågor som att du ska titta närmare på ddd) :)

Ta sen en funderare på var du vill använda för teknik för datalagring och kommer du fram till NHibernate så lär dig den och applicera där den passar in i din arkitektur.

Det kanske finns de som trivs med att bygga arktiekturen på en teknik men jag tycker inte om att göra det.

Vad det gäller

Men sen är ju frågan vad jag tjänar mest på i längden? NHibernate med BLL och UI. Eller ett DAL?

Du måste definiera tjäna för att få ett vettigt svar. Återigen bara mina åsikter men:
Lär dig att skviva ett fungerande DAL och apllicera det, gå gärna några steg till och mappa upp mot egna objekt för att få förståelse. Nu har du tjänat KUNSKAP.
Gör sen samma sak men använd en produkt som smarta personer har jobbat på i flera år: nu har du kanske tjänat TID och TESTAD kod.

Medlem sedan dec. 2005198 inlägg
#34

Preoblemet ligger i att jag tycker allt ser lika svårt ut, eller det där med DAL har jag ju "lärt" mig nu. Problemet som ligger i det är bara att jag har svårt att komma in i tänkandet på vilka funktioner som ska ha samma entiter osv men det kommer väll.
Vad menas med DDD?

Vad jag menar med att tjäna är prestande, tid, kunskap och sen hur mycket som kan återanvändas till andra projekt.

Medlem sedan juli 20011 304 inlägg
#35

ddd = domain driven design

Medlem sedan jan. 20022 440 inlägg
Medlem sedan dec. 20014 239 inlägg
#37

CatZ skrev:

http://www.infoq.com/resource/minibooks/domain-driven-design-quickly/en/pdf/dddbook.pdf

Nyfiken som jag var gick det inge bra..??

wff.jpg
Medlem sedan aug. 20003 575 inlägg
#38

Kolla länkarna som jag har postat i denna tråden där hittar du info om hur du använder NHibernate i praktiken.

http://www.webforum.nu/showthread.php?t=160289&highlight=NHibernate

Det finns också en länk till en lite längre föreläsning om NHibernate.

Medlem sedan jan. 20022 440 inlägg
#39

Zaiman skrev:

Nyfiken som jag var gick det inge bra..??

Ursäkta, du måse registrera dig för att kunna läsa den. Det är kanske inget för experterna men den är logisk och går igenom grundvalarna i ddd på ett väldigt pedagogiskt sätt... Tyvärr får den läsaren att bli intresserad att lära sig mer :)

Prova med http://www.infoq.com/news/2006/12/domain-driven-design istället.

Medlem sedan aug. 20003 575 inlägg
#40

När ni pratar om DDD så måste jag rekommendera denna boken skriven av Jimmy Nilsson http://www.amazon.com/Applying-Domain-Driven-Design-Patterns-Examples/dp/0321268202

270 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)