Правильный метод - создать бизнес-слой, который будет получать данные из слоя БД и передавать эти данные для просмотра слой (и наоборот, получить данные из View слоя и переходим к слою БД).
Кроме того, я рекомендую посмотреть на IoC (DI) подход:
Бизнес слой:
Сначала на всех, вы создаете новый ClassLibrary проект и создать бизнес-уровня классов POCO и абстракцией вашего репозиторий:
/// <summary>
/// this is a Business layer class, which is very similar on EF class
/// </summary>
public class Tag
{
public int TagId { get; set; }
public string TagName { get; set; }
}
public interface IRepository
{
List<Tag> GetTagList();
}
Затем создается служба:
public class Service
{
private readonly IRepository _repository;
public Service(IRepository repository)
{
if (repository == null)
throw new ArgumentNullException("repository");
_repository = repository;
}
public List<Tag> GetTagList()
{
return _repository.GetTagList();
}
}
На этом этапе вы скомпилировали версию бизнес-уровня. Вы можете добавить всю сложную логику своего приложения и протестировать ее. Внимательно, без DB amd Просмотр деталей!
Следующий шаг - создать слой DB
DB Layer:
Создать еще одну библиотеку классов в вашем решении, добавьте ссылку на проект BL и добавить такой код:
public class EFRepository : IRepository
{
private ... _db;
public EFRepository()
{
.....
}
public List<Tag> GetTagList()
{
var tags = (from i in _db.tblTags select new Tag { TagId = i.TagId, TagName = i.TagName }).ToList();
}
}
поэтому у вас есть уровни БД и БЛ. И ваш уровень BL не зависит от уровня БД, наоборот, уровень БД зависит от уровня BL. И это правильный подход, бизнес-логика вашего приложения не должна зависеть от БД!
Последний шаг - Вид слоя.
Просмотр слой
Вы можете отделить Просмотр слой к другому проекту тоже. Я делаю это в своем приложении ASP.NET MVC. Добавить ссылки на БД и BL проекты
public class tblTagViewModel
{
public string TagName { get; set; }
public string TagNameClr
{
get
{
if (TagName == "Test")
{
return "green";
}
else
{
return "red";
}
}
}
}
и контроллер:
public class HomeController : Controller
{
private readonly Service _service;
public HomeController(IRepository repository)
{
if (repository == null)
throw new ArgumentNullException("repository");
_service = new Service(repository);
}
public ActionResult Test()
{
List<ViewModel.tblTagViewModel> list = new List<ViewModel.tblTagViewModel>();
vat taglist = _service.GetTagList();
foreach (tblTag p in taglist)
{
ViewModel.tblTagViewModel nw = new ViewModel.tblTagViewModel();
nw.TagName = p.TagName;
list.Add(nw);
}
return View(list);
}
}
и, последний шаг, установить реализацию DB для вашего веб-приложения:
public class MyControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
var efRepository = new EFRepository();
if (controllerType == typeof(HomeController))
{
return new HomeController(efRepository);
}
return base.GetControllerInstance(requestContext, controllerType);
}
обращают внимание, что ваше веб-приложение не зависит от уровня БД, оно зависит только от BL-слоя (это тоже логично). Только одно место для установки EFRepository в вашем веб-приложении - на контроллере.
При таком подходе вы можете легко изменить EFRepository на другую реализацию IRepository, с другой БД или даже поддельной БД. Вы можете протестировать любую часть вашего приложения без ненужных отношений. У вас есть сильная и правильная архитектура, где ваше приложение зависит от уровня бизнес-логики и не зависит от уровня БД и т. Д. Любые изменения в уровне БД или уровне Света не влияют на логический уровень
Для сопоставления аналогичных классов POCO (например, BL и DB, BL и View) со многими свойствами, которые вы можете использовать Automapper
Ваш последний фрагмент кода в порядке, хотя его можно упростить до 'var list = db.tblTags.Select (t => new tblTagViewModel {TagName = t. TagName}) ToList(); return View (list); ' –
Спасибо, что я искал! Я знал, что это просто. –