Repository Factory是的Micrsoft Patterns and practies Team在前几年出的一个代码生成组件,主要生成基于Enlib DAAB的DataAccessLayer和Business Entity. 主要适用于VS2005,VS2008。从官方下载RepositoryFactoryForVS2008.msi,安装后,在Tools菜单将有一个选项Guidance Package Manager,看下面的图片:
打开后,Check Repository Factory
在Solution Explorer中通过右键选择各自的Project的Responsibilites:
打开DataBase
选择你要生成Tables:
可以选择并EDIT需要映射的SP
最后生成的Enity class:
1: [Serializable]
2: public partial class Categories
3: {
4: public Categories()
5: {
6: }
7:
8: public Categories(System.Int32 categoryID, System.String categoryName, System.String description, System.Byte[] picture)
9: {
10: this.categoryIDField = categoryID;
11: this.categoryNameField = categoryName;
12: this.descriptionField = description;
13: this.pictureField = picture;
14: }
15:
16: private System.Int32 categoryIDField;
17:
18: public System.Int32 CategoryID
19: {
20: get { return this.categoryIDField; }
21: set { this.categoryIDField = value; }
22: }
23:
24: private System.String categoryNameField;
25:
26: public System.String CategoryName
27: {
28: get { return this.categoryNameField; }
29: set { this.categoryNameField = value; }
30: }
31:
32: private System.String descriptionField;
33:
34: public System.String Description
35: {
36: get { return this.descriptionField; }
37: set { this.descriptionField = value; }
38: }
39:
40: private System.Byte[] pictureField;
41:
42: public System.Byte[] Picture
43: {
44: get { return this.pictureField; }
45: set { this.pictureField = value; }
46: }
47:
48: }
Interface:
1: /// <summary>
2: /// Repository that lets you find Categories in the database.
3: /// </summary>
4: public interface ICategoriesRepository
5: {
6:
7: List<Categories> GetAllFromCategories();
8:
9: void Add(Categories categories);
10:
11: void Remove(System.Int32 categoryIDField);
12:
13: void Save(Categories categories);
14:
15: }
具体的Repository factory class:
1: using System;
2: using System.Collections.Generic;
3: using System.Data;
4: using System.Data.Common;
5: using System.Text;
6: using Microsoft.Practices.EnterpriseLibrary.Data;
7: using RepositoryFactoryTest;
8: using RepositoryFactoryTest.BusinessEntities;
9: using RepositoryFactoryTest.Interfaces;
10: using System.Data.SqlClient;
11: using System.Diagnostics;
12: using Microsoft.Practices.Repository;
13: using Microsoft.Practices.Repository.SQLServer;
14:
15: namespace RepositoryFactoryTest.CategoriesRepositoryArtifacts
16: {
17: /// <summary>
18: /// Repository that lets you find Categories in the database.
19: /// </summary>
20: public sealed class CategoriesRepository : Repository<Categories>, ICategoriesRepository
21: {
22: public CategoriesRepository(string databaseName)
23: : base(databaseName)
24: {
25: }
26:
27: public CategoriesRepository()
28: : base()
29: {
30: }
31:
32:
33: public List<Categories> GetAllFromCategories()
34: {
35: ISelectionFactory<NullableIdentity> selectionFactory = new GetAllFromCategoriesSelectionFactory();
36:
37: try
38: {
39: NullableIdentity nullableIdentity = new NullableIdentity();
40: return base.Find(selectionFactory, new GetAllFromCategoriesFactory(), nullableIdentity);
41: }
42: catch (SqlException ex)
43: {
44: HandleSqlException(ex, selectionFactory);
45: }
46:
47: return new List<Categories>();
48: }
49:
50: public void Add(Categories categories)
51: {
52: CategoriesInsertFactory insertFactory = new CategoriesInsertFactory();
53: try
54: {
55: base.Add(insertFactory, categories);
56: }
57: catch (SqlException ex)
58: {
59: HandleSqlException(ex, insertFactory);
60: }
61: }
62:
63: public void Remove(System.Int32 categoryID)
64: {
65: IDeleteFactory<System.Int32> deleteFactory = new CategoriesDeleteFactory();
66:
67: try
68: {
69: base.Remove(deleteFactory, categoryID);
70: }
71: catch (SqlException ex)
72: {
73: HandleSqlException(ex, deleteFactory);
74: }
75: }
76:
77:
78: public void Save(Categories categories)
79: {
80: CategoriesUpdateFactory updateFactory = new CategoriesUpdateFactory();
81: try
82: {
83: base.Save(updateFactory, categories);
84: }
85: catch (SqlException ex)
86: {
87: HandleSqlException(ex, updateFactory);
88: }
89: }
90: private void HandleSqlException(SqlException ex, IDbToBusinessEntityNameMapper mapper)
91: {
92: if (ex.Number == ErrorCodes.SqlUserRaisedError)
93: {
94: switch (ex.State)
95: {
96: case ErrorCodes.ValidationError:
97: string[] messageParts = ex.Errors[0].Message.Split(':');
98: throw new RepositoryValidationException(
99: mapper.MapDbParameterToBusinessEntityProperty(messageParts[0]),
100: messageParts[1], ex);
101:
102: case ErrorCodes.ConcurrencyViolationError:
103: throw new ConcurrencyViolationException(ex.Message, ex);
104:
105: }
106: }
107:
108: throw new RepositoryFailureException(ex);
109: }
110:
111:
112: }
113: }
114:
来看下关键的Interface:
1: namespace Microsoft.Practices.Repository
2: {
3: public class Repository<TDomainObject>
4: {
5: public Repository();
6: public Repository(string databaseName);
7:
8: protected Database Database { get; set; }
9:
10: public void Add(IInsertFactory<TDomainObject> insertFactory, TDomainObject domainObj);
11: public List<TDomainObject> Find<TIdentity>(ISelectionFactory<TIdentity> selectionFactory, IDomainObjectsFactory<TDomainObject> domainObjectFactory, TIdentity identity);
12: public TDomainObject FindOne<TIdentity>(ISelectionFactory<TIdentity> selectionFactory, ISimpleDomainObjectFactory<TDomainObject> domainObjectFactory, TIdentity identity);
13: public TDomainObject FindOneComplex<TIdentity>(ISelectionFactory<TIdentity> selectionFactory, IComplexDomainObjectFactory<TDomainObject> domainObjectFactory, TIdentity identity);
14: public TDomainObject FindOneWithSqlCache<TIdentity>(ISelectionFactory<TIdentity> selectionFactory, IDomainObjectFactory<TDomainObject> domainObjectFactory, TIdentity identity, string cacheKey, TimeSpan expiry);
15: public List<TDomainObject> FindWithSqlCache<TIdentity>(ISelectionFactory<TIdentity> selectionFactory, IDomainObjectFactory<TDomainObject> domainObjectFactory, TIdentity identity, string cacheKey, TimeSpan expiry);
16: public void Remove<TIdentityObject>(IDeleteFactory<TIdentityObject> deleteFactory, TIdentityObject identityObj);
17: public void Save(IUpdateFactory<TDomainObject> updateFactory, TDomainObject domainObj);
18: }
19: }
这一套工具目前生成的Code是基于Data Access Application Block 3.1的。不过还好有SourceCode,你可以按照你的需要修改。
感觉有点像CodeSmith的,但其中n-tiers template生成的代码要比这个复杂。这个只需要VisualStudio,下一代的代码生成应该是基于T4 template了。
有时间我将介绍基于EF4的DAL的Repository的代码生成。
希望对您的开发有帮助。
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。