我定义了三个不同的类:学生、教室、课程,每个类都有不同的属性
然后我又定义了三个管理类:学生管理、教室管理、课程管理,每个管理类都有一个list存放相应的对象,并提供了Add、Delete等操作,还有编号计算功能等
==============
我发现了,这三个管理类都是很类似的,我很想把他变成一个类。可是每个ADD的传入对象都是不一样的。
我想来想去,想使用泛型写一个管理类。
可是我又在想,正在读的《深入浅出设计模式》这本书里没有提到泛型啊(嗯,才读到400页)。
如果不用泛型呢,应当是什么样子的?请大家指点设计模式泛型
然后我又定义了三个管理类:学生管理、教室管理、课程管理,每个管理类都有一个list存放相应的对象,并提供了Add、Delete等操作,还有编号计算功能等
==============
我发现了,这三个管理类都是很类似的,我很想把他变成一个类。可是每个ADD的传入对象都是不一样的。
我想来想去,想使用泛型写一个管理类。
可是我又在想,正在读的《深入浅出设计模式》这本书里没有提到泛型啊(嗯,才读到400页)。
如果不用泛型呢,应当是什么样子的?请大家指点设计模式泛型
解决方案 »
- 关于DateTime.Now比较的问题
- 取出ArrayList中重复的前一项(asp.net,c#)
- 代码释疑, class 及 property 的定义上面出现 [...] 的用法?
- 哪位能给点常用类库的源码(常用的就可以)~~~~`
- 为什么在装载窗体时也会调用Dispose
- 如何实现调查问卷网站?
- 线程套接字发送捕获不到异常
- 如何让程序在没有用户动作一定时间后自动执行一段代码?
- 兄弟帮我翻译一下,20分马上划拨!!!
- 大家觉得c#怎么样?我看了一下,居然连指针都不能用,tnnd,这算什么?
- 无法将类型string隐式转换为int怎么解决
- 使用XMLDOCUMENT写XML文件遇到的一个问题。
或者使用“代码生成器”,事实上,你可以理解泛型的本质就是一个在CLR层面的代码生成器,自动根据泛型类编译创造出具体的类。
没必要老是这么挑别人刺,你想说的就是ddd思想吧,但显然楼主还是在基础学习阶段,你扯ddd,对别人有一丁点帮助吗?
泛型加反射,没充分分析,就现阶段需求,应该可以实现,但随着基础功能的扩展,你维护你的反省管理类,难度将是几何级数的上升。
就用三层吧,三层虽然确实是个很傻瓜的构架,但就像新手从傻瓜相机学起,也没什么不好,有一定功力了,再上单反。
一段时间之后,当你纠结于无尽的sql 增删改,联表查询,数据绑定,交叉引用,互相依赖的时候,你会大骂,这当初是哪个sb设计的,一件事,我tm要做三遍才能完成,大量ctrl c+v代码,一会dataTable 一会DataObject。
这个时候,你就会思考,我为什么要分层。我的理解是业务抽象,解耦,封装,职责划分。
明白了这些,就不需要在纠结业务层的划分了,到时候2层还是4,5,6层、中间需不需要夹个orm都随你了。再然后好吧 我说不出来了 ,p哥帮我接吧。
@sp1234
/// Repository , CURD
/// </summary>
public partial interface IRepository<T> where T : BaseEntity
{
T GetById(object id);
void Insert(T entity);
void Update(T entity);
void Delete(T entity);
IQueryable<T> Table { get; }
}
EF 中可以这样: 增删改查类似
public new IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity
{
return base.Set<TEntity>();
}
/// <summary>
/// Entity Framework repository
/// </summary>
public partial class EfRepository<T> : IRepository<T> where T : BaseEntity
{
private readonly IDbContext _context;
private IDbSet<T> _entities; /// <summary>
/// Ctor
/// </summary>
/// <param name="context">Object context</param>
public EfRepository(IDbContext context)
{
this._context = context;
} public T GetById(object id)
{
return this.Entities.Find(id);
} public void Insert(T entity)
{
try
{
if (entity == null)
throw new ArgumentNullException("entity"); this.Entities.Add(entity); this._context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine; var fail = new Exception(msg, dbEx);
//Debug.WriteLine(fail.Message, fail);
throw fail;
}
} public void Update(T entity)
{
try
{
if (entity == null)
throw new ArgumentNullException("entity"); this._context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); var fail = new Exception(msg, dbEx);
//Debug.WriteLine(fail.Message, fail);
throw fail;
}
} public void Delete(T entity)
{
try
{
if (entity == null)
throw new ArgumentNullException("entity"); this.Entities.Remove(entity); this._context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); var fail = new Exception(msg, dbEx);
//Debug.WriteLine(fail.Message, fail);
throw fail;
}
} public virtual IQueryable<T> Table
{
get
{
return this.Entities;
}
} private IDbSet<T> Entities
{
get
{
if (_entities == null)
_entities = _context.Set<T>();
return _entities;
}
}
}
跪求大神
就我有限的知识,三层的架构往往是在比较大的软件系统、多人合作的时候发挥威力,作为我单枪匹马考虑问题来说,是有点不配套。但是我看自己的代码呢,也觉得需要适当的梳理一下,否则真的看着很不舒服。在我这个场景里,让我很不爽的是。我要写三个管理类,每个类都要写一遍add、delete、以及SavetoFile之类的函数。这三个类太相似了!唯一的区别就是每个函数的传入参数类型不一致。按照设计模式的理念,代码不应当重复,否则就有坏味道。因此,我很想解决他。更何况,如果有第四个类,我怎么办?我想来想去,泛型也不好用。因为每个管理类可能还有自己独有的函数。这些类是相似,但不是完全一样。我记得哪里听说,微软内部也是有使用代码生成器的。也许,这样的代码重复从现实实现上讲是无法避免的?真正的解决方法,就是ORM 这些了。
昨晚苦思不得解,可能对sp1234的语气有所不善,在此一并致歉!
http://social.msdn.microsoft.com/Forums/zh-cn/vstszhchs/thread/90c30227-b7e2-44ca-96cd-c9ec879c91e5
最终,我使用的还是泛型,正如ProgrammingVolunteer所说:“设计模式的那个时候还没有泛型这个概念,呵呵。”用泛型不是设计模式的错。很好笑的是,blue_apple2006 当时回复我的代码,我看的头疼,也就是看不懂。略过了。当我写出自己的代码后,才发现自己的代码和他贴出来的类似,我就是在朝这份代码前进!