Re: [altdotnetturkiye] Generic Unit Of Work

305 views
Skip to first unread message

Emre Mert Asyalıoğlu

unread,
Jan 24, 2013, 8:15:19 AM1/24/13
to Alt. Net Türkiye Google Group

Sırası gelmişken şurada da 

http://www.codeproject.com/Articles/363501/Repository-pattern-with-Entity-Framework-Code-Firs

böyle bir yapı var. 


Emre Mert Asyalıoğlu

On Jan 24, 2013 2:49 PM, "Bahadır Arslan" <bahadi...@gmail.com> wrote:
Selam Arkadaşlar,

Daha önce katıldığım ama bir türlü (nedense) içine girmediğim DI, IoC, falan fişmekan teknolojilerin içine tekrar girdikten sonra Doğa'nın çaprısı üzerine tekrar döndüm. Zira hem sizden öğreneceğim çok şey var hem de soracaklarım :)

Mesela ilk sorum acaba Unit of Work generic olabilir mi?
Ben bir Generic Repository yapısı kurdum EF 5.0 Code First ile. Ayrıca Unit Of Work patternini de uyguladım.

Acaba Unit of Work'ü generic yapabilir miyim yapamaz mıyım onu merak ediyorum.
Eğer yapmazsam UoW içerisinde her bir repository için ayrı ayrı property'ler tanımlayacağım. 
Şayet UoW'u generic yaparsam (ki aslında yaptım) verdiğim generic entity'e uygun olan repo üzerinden yürüyebilirim.

Bu konuda yorumunuz nedir?

--
You received this message because you are subscribed to the Google Groups "altdotnetturkiye" group.
To post to this group, send email to altdotne...@googlegroups.com.
To unsubscribe from this group, send email to altdotnetturki...@googlegroups.com.
Visit this group at http://groups.google.com/group/altdotnetturkiye?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Uğur Tılıkoğlu

unread,
Jan 24, 2013, 9:45:15 AM1/24/13
to altdotne...@googlegroups.com
Bahadır hocam, repository ve unit of work kodunu paylaşabilirsen ve nasıl kullanmak istediğini örnekle açıklayabilirsen, yardımcı olan mutlaka çıkacaktır.

2013/1/24 Emre Mert Asyalıoğlu <easya...@gmail.com>

Bahadır Arslan

unread,
Jan 24, 2013, 10:20:18 AM1/24/13
to altdotne...@googlegroups.com
Selamlar,

Şöyle ki mevcutta aşağıdaki sınıflara sahibim.

IUnitOfWork.cs

namespace DbCore {
    public interface IUnitOfWork {
        void Dispose();
        GenericRepository<Test> TestRepository {
            get;
        }
        void Save();
    }
}

UnitOfWork.cs

 namespace DbCore {
        public class UnitOfWork : IDisposable, DbCore.IUnitOfWork  {
            private MyDbContext context = new MyDbContext ();
            private GenericRepository<Test> testRepository;

            public GenericRepository<Test> TestRepository {
                get {
                    if(this.testRepository == null) {
                        this.testRepository = new GenericRepository<Test>(context);
                    }
                    return testRepository;
                }
            }

            public void Save() {
                context.SaveChanges();
            }

            private bool disposed = false;

            protected virtual void Dispose(bool disposing) {
                if(!this.disposed) {
                    if(disposing) {
                        context.Dispose();
                    }
                }
                this.disposed = true;
            }

            public void Dispose() {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
        }
    }

IGenericRepository.cs

namespace DbCore {
    public interface IGenericRepository<TEntity>
     where TEntity : class {
        void Delete(object id);
        void Delete(TEntity entityToDelete);
        System.Collections.Generic.IEnumerable<TEntity> Get(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null, Func<System.Linq.IQueryable<TEntity>, System.Linq.IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "");
        System.Collections.Generic.IEnumerable<TEntity> GetAll();
        TEntity GetByID(object id);
        System.Collections.Generic.IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters);
        void Insert(TEntity entity);
        void Update(TEntity entityToUpdate);
    }
}

GenericRepository.cs

    namespace DbCore {
        public class SortExpression<TEntity, TType> {
            Expression<Func<TEntity, TType>> SortProperty;
        }

        public class GenericRepository<TEntity> : DbCore.IGenericRepository<TEntity> where TEntity : class {
            internal MyDbContext context;
            internal DbSet<TEntity> dbSet;

            public GenericRepository(MyDbContext context) {
                this.context = context;
                this.dbSet = context.Set<TEntity>();
            }

            public virtual IEnumerable<TEntity> Get(
                Expression<Func<TEntity, bool>> filter = null,
                Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
                string includeProperties = "") {
                IQueryable<TEntity> query = dbSet;

                if(filter != null) {
                    query = query.Where(filter);
                }

                foreach(var includeProperty in includeProperties.Split
                    (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) {
                    query = query.Include(includeProperty);
                }

                if(orderBy != null) {
                    return orderBy(query).ToList();
                }
                else {
                    return query.ToList();
                }
            }

            public virtual IEnumerable<TEntity> GetAll() {

                return dbSet.ToList();
            }

            public virtual TEntity GetByID(object id) {
                return dbSet.Find(id);
            }

            public virtual void Insert(TEntity entity) {
                dbSet.Add(entity);
            }

            public virtual void Delete(object id) {
                TEntity entityToDelete = dbSet.Find(id);
                Delete(entityToDelete);
            }

            public virtual void Delete(TEntity entityToDelete) {
                if(context.Entry(entityToDelete).State == EntityState.Detached) {
                    dbSet.Attach(entityToDelete);
                }
                dbSet.Remove(entityToDelete);
            }

            public virtual void Update(TEntity entityToUpdate) {
                dbSet.Attach(entityToUpdate);
                context.Entry(entityToUpdate).State = EntityState.Modified;
            }

            public virtual IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters) {
                return dbSet.SqlQuery(query, parameters).ToList();
            }
        }
    }
Şimdi buradaki Unit Of Work içerisinde GenericRepository<Test> var ya, ben acaba UoW'u generic yapsam ve bunu da Repository olarak tanımlasam.
Böylece UoW içerisine eklemem gereken her repo için ayrı ayrı prop yapmak yerine sadece UoW u uygun entity tipi ile oluştursam.

Mantıklı olur mu?

24 Ocak 2013 16:45 tarihinde Uğur Tılıkoğlu <tili...@gmail.com> yazdı:



--
Saygılarımla...
Bahadır ARSLAN
MCPD
www.bahadirarslan.com

Doga Oztuzun

unread,
Jan 24, 2013, 10:22:47 AM1/24/13
to altdotne...@googlegroups.com
UoW'da sadece DataContext'i tutman yeterli olacaktir aslinda ?

2013/1/24 Bahadır Arslan <bahadi...@gmail.com>

e GenericRepository<Test> var ya, ben acaba UoW'u generic yapsam ve bunu da Repository olarak tanımlasam.
Böylece UoW içerisine eklemem gereken her repo için ayrı ayrı prop yapmak

Bahadır Arslan

unread,
Jan 24, 2013, 10:24:47 AM1/24/13
to altdotne...@googlegroups.com
Doğa, sanıyorum DbContext zaten UoW u içerdiği için böyle diyorsun. İşte bu da farklı bir kafa karışıklığı.
İnternette böyle de birçok örnek var, kimse de dememiş ki zaten vara hiç gerek yok UoW a


2013/1/24 Doga Oztuzun <unq...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "altdotnetturkiye" group.
To post to this group, send email to altdotne...@googlegroups.com.
To unsubscribe from this group, send email to altdotnetturki...@googlegroups.com.
Visit this group at http://groups.google.com/group/altdotnetturkiye?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Sidar Ok

unread,
Jan 24, 2013, 10:35:31 AM1/24/13
to altdotne...@googlegroups.com
Eger UoW nin icerisinde sadece DB related i$Ler yapiliyorsa ayri bir UoW ye gerek yok. NH da session Linq de ve EF de DataContext yapisi zaten UoW olarak tasarlanmi$.

Web uygulamalari icin request per session $eklinde architecture oturttugunda UoW zaten oturmu$ oluyor.


2013/1/24 Bahadır Arslan <bahadi...@gmail.com>

Uğur Tılıkoğlu

unread,
Jan 24, 2013, 10:37:06 AM1/24/13
to altdotne...@googlegroups.com
hocam şöyle olabilir mi?

1 - IUnitOfWork üzerindeki repository property'sini kaldırmak ve üzerinde doğa'nın dediği gibi DbContext ve Save methodunu bırakmak
2 - IGenericRepository üzerinde IUnitOfWork tipli bir property oluşturmak
3 - GenericRepository üzerinde IUnitOfWork tipinde parametre alan bir constructor oluşturmak ve DbContext alan constructoru kaldırmak

böylelikle şu kullanıma sahip olabilirsin.

IUnitOfWork uow = new MyUnitOfWork(new TestDbContext());

PersonRepository personRepo = new PersonRepository(uow);
personRepo.Add(new Person());

AddressRepository addrRepo = new AddressRepository(uow);
addrRepo.DeleteByID(1);

uow.Save(); // ya da personRepo.UnitOfWork.Save();

2013/1/24 Bahadır Arslan <bahadi...@gmail.com>

Bahadır Arslan

unread,
Jan 24, 2013, 10:39:40 AM1/24/13
to altdotne...@googlegroups.com
Uğur Hocam, yani yapıyı tersine çevirelim diyorsun.

Ben buna bir bakayım, enteresan bi implementasyon oldu.


24 Ocak 2013 17:37 tarihinde Uğur Tılıkoğlu <tili...@gmail.com> yazdı:

Uğur Tılıkoğlu

unread,
Jan 24, 2013, 10:41:35 AM1/24/13
to altdotne...@googlegroups.com
aynen ;)

Sidar hocam, "DbContext unit of worktür, DbSet de repository'dir" yaklaşımı ile "Hayır bunları mutlaka bir IUnitOfWork ve IRepository ile soyutlamalıyız" yaklaşımı biz ölene kadar tartışılacaktır mutlaka :) bana ikinci yaklaşım daha sıcak geliyor.

2013/1/24 Bahadır Arslan <bahadi...@gmail.com>

Sidar Ok

unread,
Jan 24, 2013, 10:44:47 AM1/24/13
to altdotne...@googlegroups.com
Benim tecrubelerim YAGNI oldugu yonunde.

Ayrica buyuk dezavantajlari da var. Mesela kendi yazdigimiz UoW nin transaction i olmak zorunda,memory management / object disposition / garbage collection gibi task lari handle etmek zorunda.Gereksiz yere souytlanmi$ UoW yuzunden DB ye connected cali$amiyoruz ve ORM in object tracking gibi kolayliklarindan faydalanamiyoruz, gereksiz attach maliyetleri getiriyoruz.

Over abstraction, ba$ka bir$ey degil.


2013/1/24 Uğur Tılıkoğlu <tili...@gmail.com>



--

Sidar Ok

unread,
Jan 24, 2013, 10:46:01 AM1/24/13
to altdotne...@googlegroups.com
Dezavantajlari bunlarken avantajlar bakimindan bunlari kompanse edecek getirisini de goremiyorum ayrica.


2013/1/24 Sidar Ok <sid...@gmail.com>

Uğur Tılıkoğlu

unread,
Jan 24, 2013, 10:52:13 AM1/24/13
to altdotne...@googlegroups.com
Eğer web uygulamasında session per request şeklinde çalışıyorsan kesinlikle haklısın, imzamı atarım.

Eğer web uygulaması, senin bir presentation layer'ın olarak ayrı bir sunucuda duruyor ve entityler zaten disconnected olarak gidiyorsa, bu iki yaklaşım arasında yine çok bir fark yok, ama kodun testable olması açısından fayda var.

Sırf şu DTO, entity design, state tracking üzerine bir tartışma yapalım istiyorum, bir ben mi dert ediyorum yoksa herkesin derdi mi, merak ediyorum :)

2013/1/24 Sidar Ok <sid...@gmail.com>

Sidar Ok

unread,
Jan 24, 2013, 11:03:04 AM1/24/13
to altdotne...@googlegroups.com
Mesela NH da ISession gayet de testable. EF de boyle mi bilmiyorum.

O tarti$malari yapmi$tik onceden grupta sanirim, bulabilirsin aratirsan.


2013/1/24 Uğur Tılıkoğlu <tili...@gmail.com>

Sidar Ok

unread,
Jan 24, 2013, 11:03:15 AM1/24/13
to altdotne...@googlegroups.com
Hatta canlandirabilirsin de :)

Bahadır Arslan

unread,
Jan 24, 2013, 11:03:20 AM1/24/13
to altdotne...@googlegroups.com
Ben henüz çok yeniyim bu konularda, sizin bu tartışmaya bile adam gibi yorumda bulunamıyorum.

Gerçekten bi de DTO olayı var ki onu da Tuğberk'in örneğinde gördüm. Ne işe yarar henüz hiç bakmadım.


24 Ocak 2013 17:52 tarihinde Uğur Tılıkoğlu <tili...@gmail.com> yazdı:

Murat HAKSAL

unread,
Jan 24, 2013, 11:10:54 AM1/24/13
to altdotne...@googlegroups.com
Bahadır hoşgeldin,

Nhibernate uow impl için Rhino.commons ı kullanmıştım.
Aşağıdaki linkler soruna yardımcı olabilir.


2013/1/24 Bahadır Arslan <bahadi...@gmail.com>
Selam Arkadaşlar,

Daha önce katıldığım ama bir türlü (nedense) içine girmediğim DI, IoC, falan fişmekan teknolojilerin içine tekrar girdikten sonra Doğa'nın çaprısı üzerine tekrar döndüm. Zira hem sizden öğreneceğim çok şey var hem de soracaklarım :)

Mesela ilk sorum acaba Unit of Work generic olabilir mi?
Ben bir Generic Repository yapısı kurdum EF 5.0 Code First ile. Ayrıca Unit Of Work patternini de uyguladım.

Acaba Unit of Work'ü generic yapabilir miyim yapamaz mıyım onu merak ediyorum.
Eğer yapmazsam UoW içerisinde her bir repository için ayrı ayrı property'ler tanımlayacağım. 
Şayet UoW'u generic yaparsam (ki aslında yaptım) verdiğim generic entity'e uygun olan repo üzerinden yürüyebilirim.

Bu konuda yorumunuz nedir?

--

Bahadır Arslan

unread,
Jan 24, 2013, 11:11:30 AM1/24/13
to altdotne...@googlegroups.com
Hoşbulduk, teşekkürler :)

Bakıyorum hocam, sağolasın.


24 Ocak 2013 18:10 tarihinde Murat HAKSAL <murat....@gmail.com> yazdı:

Uğur Tılıkoğlu

unread,
Jan 24, 2013, 11:26:33 AM1/24/13
to altdotne...@googlegroups.com
@Sidar Entity Framework'ü testable yapmak için ekstra işler gerekiyor. Geçmişteki tartışmalara ben de katılmıştım ama, açıp bir daha okuyayım ;)

2013/1/24 Bahadır Arslan <bahadi...@gmail.com>

Doga Oztuzun

unread,
Jan 24, 2013, 12:00:57 PM1/24/13
to altdotne...@googlegroups.com
Bende EF - code first kullaniyorum, implementasyonu mu paylasmak icin bir hazirlik yapayim.


2013/1/24 Uğur Tılıkoğlu <tili...@gmail.com>

Tuna Toksoz

unread,
Jan 24, 2013, 12:27:39 PM1/24/13
to altdotne...@googlegroups.com
birazdan source code u commentli, unit testleri yazilmis, build scriptlerindeki testler otomatik calisir hale getirilmis bir proje cikacak karsimiza.
Tuna Toksöz
Eternal sunshine of the open source mind.


2013/1/24 Doga Oztuzun <unq...@gmail.com>

Uğur Tılıkoğlu

unread,
Jan 24, 2013, 12:30:02 PM1/24/13
to altdotne...@googlegroups.com
doğa çok uğraşma, unit testler olmasa da olur ;)

2013/1/24 Tuna Toksoz <teh...@gmail.com>

Mehmet Erdanışman

unread,
Jan 24, 2013, 1:31:47 PM1/24/13
to altdotne...@googlegroups.com

Alt. Net Doga'ya odaklanmis durumda.. :)

24 Oca 2013 19:30 tarihinde "Uğur Tılıkoğlu" <tili...@gmail.com> yazdı:

Tuna Toksoz

unread,
Jan 24, 2013, 1:32:59 PM1/24/13
to altdotne...@googlegroups.com
offline olmasa iyiydi gtalkdan :)

Tuna Toksöz
Eternal sunshine of the open source mind.


2013/1/24 Mehmet Erdanışman <mehmeter...@gmail.com>

Mehmet Erdanışman

unread,
Jan 25, 2013, 3:02:13 AM1/25/13
to altdotne...@googlegroups.com
yalnız  zaman geçtikçe beklentide artıyor :)

24 Ocak 2013 20:32 tarihinde Tuna Toksoz <teh...@gmail.com> yazdı:

Uğur Tılıkoğlu

unread,
Jan 25, 2013, 3:03:39 AM1/25/13
to altdotne...@googlegroups.com

Insansiz hava araci ornegi gelebilir :)

25 Oca 2013 10:02 tarihinde "Mehmet Erdanışman" <mehmeter...@gmail.com> yazdı:

oguzh4n

unread,
Jan 25, 2013, 6:07:44 AM1/25/13
to altdotnetturkiye
https://github.com/NicholasMurray/CodeCamper bu projedeki repository
ve uow mantığı benim hoşuma gitmişti çok

Mehmet Erdanışman

unread,
Feb 12, 2013, 3:02:40 PM2/12/13
to altdotne...@googlegroups.com
Merhabalar,

Doga'dan haber alan arkadaşlar var mı ? En son kendi implementasyonunu paylaşmak için hazırlık yapıyordu. 

Yayınladı mı yoksa ?

24 Ocak 2013 Perşembe 14:46:26 UTC+2 tarihinde Bahadır Arslan yazdı:

Eralp Erat

unread,
Feb 12, 2013, 3:15:53 PM2/12/13
to altdotne...@googlegroups.com
:)

Doğa'nın kendisi uow oldu.

Doğa öyle eller havaya eller havaya olmuyor hep :)

Doğaaaaa ; give me something to me kill the pain..

Cem Yılmaz (Dedin yapacaksın) : http://www.youtube.com/watch?v=k6nQzfHPcyk

;)  

2013/2/12 Mehmet Erdanışman <mehmeter...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "altdotnetturkiye" group.
To unsubscribe from this group and stop receiving emails from it, send an email to altdotnetturki...@googlegroups.com.

To post to this group, send email to altdotne...@googlegroups.com.

Mehmet Erdanışman

unread,
Feb 12, 2013, 3:32:17 PM2/12/13
to altdotne...@googlegroups.com

:)) Doga unuttuk sandin dimi ?
Bir Alt.Net ci asla unutmaz..

12 Şub 2013 22:15 tarihinde "Eralp Erat" <eralp...@gmail.com> yazdı:

Doga Oztuzun

unread,
Feb 19, 2013, 7:09:25 AM2/19/13
to altdotne...@googlegroups.com
Pardon islerden dolayi kapattim kendimi iyi geyik donmus ustumuzden :P

Biraz daha vakte ihtiyacim var : )

Emre Mert Asyalıoğlu

unread,
Feb 19, 2013, 7:11:36 AM2/19/13
to Alt. Net Türkiye Google Group

Senden biraz daha ses cikmasaydi ofise cukartma yapabikirdik zaten ;)

Emre Mert Asyalıoğlu

Reply all
Reply to author
Forward
0 new messages