Лично мне очень нравится 3-ярусная структура, и я могу только порекомендовать ее. Давайте посмотрим простой пример с небольшим кэшированием. Сейчас мы фокусируемся на структуре.
Предположим, что у нас есть следующая структура кода.
public class BlogEntry
{
public int Id { get; set; }
public string Title { get; set; }
public string Text { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<Blog> Blogs { get; set; }
}
public BlogContext : DbContext
{
public DbSet<Category> Category { get; set; }
public DbSet<BlogEntry> Entry { get; set; }
}
ум, что EF создаст первичные и внешние ключи в БД по именования (например, «Id»). Вы также можете использовать модель Db-first, а не проблему.
Давайте есть некоторые объекты DTO (см MSDN или wiki), как:
public class CategoryDto
{
// To use in LINQ .Selector()
public Expression<Func<Category, CategoryDto>> Selector = efCategory => new CategoryDto
{
Id = efCategory.Id,
Name = efCategory.Name,
}
public int Id { get; set; }
public int Name { get; set; }
}
Конечно категории часто не меняется, так что мы можем создать какой-то кэш для них. Кэширование в этом случае явно находится на уровне BLL, используя объекты Dto. Обновление: Это хорошо, только если у вас есть некоторые данные, которые вряд ли могут измениться, но доступ к ним очень часто. В противном случае не беспокойтесь об этом.
public class MainCache
{
// Make it singleton
// Create some init and a refresh method, watch for thread-safety
public List<CategoryDto> Categories { get; set; }
}
Таким образом, уровень управления может получить доступ к кэшу, как это: Update: Теперь результат действия сам кэшируется, детали here. Это безопасное решение, рамки делают все.
[HttpGet]
[OutputCache(Duration=10, VaryByParam="none")]
public ActionResult DisplayCategories()
{
// Calling BLL, receiving Dto objects
var model = MainCache.Instance.Categories;
return View(model);
}
Надеюсь, вы его получите. Я думаю, что это общая структура, которая может использоваться в различных ситуациях. Если что-то непонятно, просто спросите.
Update: Minor код исправления, и о кэшировании
Я должен признать, Im не так хорошо знакомы с EF и DB первой модели, но все-таки интересно узнать больше .. Я считаю, EF, как должен знать технологию, но не вижу хорошие исходные примеры веб-проектов, релевантных, любые предложения? , Что касается примера ура, я не вижу кеширование, как вы его точно контролируете? Как насчет времени? Как долго он кэшируется? Кроме того, я думаю, что это не совсем классический способ 3tier, но исправьте меня, если я ошибаюсь – Popokoko
Как вы упомянули, да, это немного сложнее, чем классический 3tier, это скорее 4. (Ctrl + View, Модели Views , BLL + DTO, DAL = EF). И я скорее сосредоточился на структуре, вы найдете больше о кешировании [здесь] (http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output -caching-cs) и [здесь] (http://stackoverflow.com/questions/343899/how-to-cache-data-in-a-mvc-application) –
Об EF вы можете начать с [MSDN] (http://msdn.microsoft.com/en-us/data/ee712907), помимо статей есть несколько хороших блогов в правой части страницы, например http://thedatafarm.com/blog/ –