Внедрение DI в проекте asp.net - PullRequest
       16

Внедрение DI в проекте asp.net

0 голосов
/ 25 декабря 2018

Я использую ASP.Net, Entity Framwork вместе с интеграцией Microsoft Unity Framework, ниже приведены настройки для потребления данных:

  1. DataObjects:
    1. ArticleDo - содержит всесущности, необходимые для базы данных.
    2. GenericDo - содержит все сущности, общие для всего проекта.
  2. Дао.(Конкретные классы)
    1. ArticleDao - содержит реализованные функции, специфичные для статей из IArticleDao.(Это наследует GenericDao, IArticleDao
    2. GenericDao - это абстрактный класс, он содержит реализацию универсальных функций, используемых в проекте.
  3. Интерфейсы.
    1. IArticleDao - содержит декларацию функций, специфичных для статьи. (Наследует IGenericDao)
    2. 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-коде файла?

...