Я использую ASP.Net, Entity Framwork вместе с интеграцией Microsoft Unity Framework, ниже приведены настройки для потребления данных:
- DataObjects:
- ArticleDo - содержит всесущности, необходимые для базы данных.
- GenericDo - содержит все сущности, общие для всего проекта.
- Дао.(Конкретные классы)
- ArticleDao - содержит реализованные функции, специфичные для статей из IArticleDao.(Это наследует GenericDao, IArticleDao
- GenericDao - это абстрактный класс, он содержит реализацию универсальных функций, используемых в проекте.
- Интерфейсы.
- IArticleDao - содержит декларацию функций, специфичных для статьи. (Наследует IGenericDao)
- IGenericDao - содержит декларацию всех универсальных функций, общих для проектов, таких как извлечение определенного поля из базы данных и т. Д.. (Это наследует IGenericDao
Вот реализация:
DataObjects.
1. ArticleDo:
public class ArticleDo
{
public virtual int Id { get; set; }
public virtual int WordCount { get; set; }
public virtual string Title { get; set; }
}
2.GenericDo:
public class GenericDo
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
}
Бизнес-уровень (классы бетона)
1. ArticleDao:
public class ArticleDao : GenericDao<ArticleDo, DataContext>, IArticleDao
{
private readonly Data.DataContext db;
public ArticleDao()
{
db = new Data.DataContext();
}
public override string Add(ArticleDo entity)
{
entity.AddedBy = Common.CurrentUsername;
db.Articles.Add(entity);
var returnVal = db.SaveChanges();
if (returnVal > 0)
return "Success";
return "Fail";
}
public List<ArticleDo> Search(string SearchTerm, int CurrentPage, out int Total)
{
SearchTerm = SearchTerm.ToLower();
var totalRecords = List().Where(x => x.ArticleId.ToString() == SearchTerm ||
(x.Title.ToString().ToLower().Contains(SearchTerm)));
Total = totalRecords.Count();
return totalRecords.Skip(CurrentPage * Common.Page_SIZE).Take(Common.Page_SIZE).ToList();
}
}
2. GenericDao:
public abstract class GenericDao<T, C> : IGenericDao<T, C> where T : class where C : DbContext, new ()
{
private readonly DataContext _db = new DataContext();
private C _entities = new C();
public virtual string Add(T entity)
{
_entities.Set<T>().Add(entity);
return "Success";
}
public virtual bool Delete(T entity)
{
_entities.Set<T>().Remove(entity);
return true;
}
public T Get(T entity)
{
var _get = _entities.Set<T>();
if (_get == null) return null;
return _get.First();
}
public virtual List<T> List()
{
return _entities.Set<T>().ToList();
}
public virtual bool Update(T entity)
{
_entities.Entry(entity).State = EntityState.Modified;
return true;
}
public T FindByProperty(string property, object value)
{
var _find = _db.Database.SqlQuery<IEnumerable<T>>(string.Format("SELECT a.* from {0} a where a.p0 = p1", typeof(T).FullName), new object[] { property, value });
if (_find != null && _find.Any())
{
return (T)_find.First();
}
return null;
}
}
DataInterfaces.
1. IArticleDao
public interface IArticleDao : IGenericDao<ArticleDo, DataContext>
{
List<ArticleDo> Search(string SearchTerm, int CurrentPage, out int Total);
}
2. IGenericDao
public interface IGenericDao : IGenericDao<GenericDo, DataContext> { }
public interface IGenericDao<T, C>
{
string Add(T entity);
bool Update(T entity);
bool Delete(T entity);
List<T> List();
T Get(T entity);
T FindByProperty(string property, object value);
}
Теперь, прежде чем я реализую сущности, которые будут разрешать `IArticleDao`, я смог быпозвони в мой бизнесфункции слоя, я пытался создать конкретный объект прямо на странице позади, как:
IArticleDao dao = new ArticleDao();
Теперь, насколько я понимаю, так как ArticleDao
наследует GenericDao<ArticleDo, DataContext>
, я должен иметь доступ ко всем ArticleDo
сущности из dao
объекта, но этого не происходит, может кто-нибудь, пожалуйста, помогите мне достичь этого, я не хочу наследовать ArticleDao
в ArticleDo
, потому что это противоречит цели интеграции DI.Кроме того, как я могу использовать инъекцию в конструктор, мне нужно создать конструктор в моем aspx-коде файла?