<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
body {
margin:0px;
}
main {
margin: 1cm auto;
width: 50%;
padding: 1cm;
border: 1px solid black;
}
nav {
border: 1px solid black;
}
</style>
</head>
<body>
<nav>
<label>Name: <input type="text" name="name"> </label>
<label>Surname: <input type="text" name="surname"> </label>
</nav>
<main>
<h1> Welcome! </h1>
<p> This is your first page </p>
</main>
<footer> Service Networking </footer>
</body>
</html>
Вы использовали <footer>
, до nav
и main
.
Общее понятие, к которому Вы обращаетесь, является "незнанием персистентности" (PI), хотя это обычно применяется непосредственно к самим объектам, а не коду, который использует объекты.
В любом случае Будьте в спящем режиме, и NHibernate исходно поддерживают PI, но начальная версия Платформы Объекта Microsoft не делает. MS получил много взбучки для этого, и PI является, вероятно, № 1 наиболее обсужденная функция следующей версии (каждый раз, когда это).
До какого Вы пытаетесь сделать с интерфейсами, набор Панелей должен быть изменен после того, как он получен? Если ответ да, нет никакого легкого ответа. Даже ковариантность не могла помочь Вам здесь потому что ICollection<T>
имеет Добавить метод.
Если набор только для чтения, то Вы могли бы рассмотреть представление его как IEnumerable<IBar>
. Enumerable.Cast
метод делает это довольно удобным.
interface IFoo
{
IEnumerable<IBar> Bars { get; }
}
partial class Foo : IFoo
{
IEnumerable<IBar> IFoo.Bars
{
get { return Bars.Cast<IBar>(); }
}
}
Кроме того, я знаю о по крайней мере одном усилии сделать текущую версию незнания персистентности поддержки EF.
Я - Java-разработчик, таким образом, я не могу прокомментировать ни с какими полномочиями Платформу Объекта. Я могу сказать Вам, что решениям ORM нравится, в спящем режиме, позволяют иметь персистентность POJO, не имея необходимость обращаться к общим абстрактным классам, интерфейсам, или изменяя код байта. Это обрабатывает отношения как 1:m, Вы цитируете для своего Foo и Bar, не имея необходимость использовать специальные классы набора.
Специальный соус воплощен в отображающуюся конфигурацию, и Будьте в спящем режиме саму.
Немного то, что я читал о Платформе Объекта, предполагает, что это - решение ORM с той же целью: ПОСТЕПЕННО персистентность. Я не видел упоминания об интерфейсах. Я не вижу потребность в них от Вашего примера, потому что это слишком абстрактно.
Я вывожу, что возможно получить ту независимость между бизнес-объектами и уровнем персистентности, не имея необходимость обращаться к тем интерфейсам, потому что я знаю, в спящем режиме, делает это. Я сказал бы, что решение Spring JDBC выполняет его также, потому что нет никакой потребности в единых интерфейсах. Они используют конструкцию RowMapper для переправления данных из запроса и в объект.
Мне бы хотелось советовать Вам точно, как сделать это с Платформой Объекта, но возможно Вы наберетесь храбрости, зная, что это может быть сделано.
Используйте частичный класс для разделения логики и правил от автоматически сгенерированных объектов EF. В примере ниже FooEntityObject класс разделяется на два использования частичного ключевого слова. Я использовал эту технику прежде с EF и LINQ к SQL. Частичные классы могут быть сохранены в отдельных файлах поэтому, если Ваш повторно создавать Ваш EF возражают снова, что Ваш пользовательский код не становится перезаписанным.
interface IFoo
{
public ICollection<IBar> GetBars();
}
public partial class FooEntityObject : IFoo
{
public ICollection<IBar> GetBars()
{
// convert EntityCollection<Bar> into ICollection<IBar> here
}
}
public partial class FooEntityObject
{
EntityCollection<Bar> Bars{get;set;}
}
Недавно я написал подробный пост об этом: Невосприимчивость к постоянству в ADO.NET Entity Framework . Возможно, вы захотите взглянуть на EFPocoAdapter. Это делает именно это, и в конечном итоге он устареет в EF v2.
Для чего это стоит, я использую EFPocoAdapater, и он хорошо работает для меня.
Мы делаем то же самое для LINQ to SQL. Я решил проблему с коллекцией, написав класс, который обертывает IList
и, при необходимости, приводит к правильному типу и обратно. Это выглядит примерно так:
public class ListWrapper<TSource, TTarget> : IList<TTarget>
where TTarget : class
where TSource : class, TTarget
{
private IList<TSource> internalList;
public ListWrapper(IList<TSource> internalList)
{
this.internalList = internalList;
}
public void Add(TTarget item)
{
internalList.Add((TSource)item);
}
public IEnumerator<TTarget> GetEnumerator()
{
return new EnumeratorWrapper<TSource, TTarget>(internalList.GetEnumerator());
}
// and all the other IList members
}
EnumeratorWrapper аналогично оборачивает IEnumerator и выполняет приведение. В частичных классах LINQ to SQL мы представляем свойство следующим образом:
public IList<ICustomer> Foos
{
get
{
return new ListWrapper<Foo, IFoo>(this.Foos_internal);
}
}
Любые изменения в представленном списке будут выполняться во внутреннем EntitySet, поэтому они будут синхронизированы.
Это работает достаточно хорошо, но я чувствую, что весь этот подход доставляет больше хлопот, чем стоит, я большой поклонник NHibernate и большой сторонник PI, но мы приложили МНОГО дополнительных усилий, делая это и убежище действительно не видел никакого преимущества. Мы используем шаблон репозитория, чтобы абстрагироваться от фактического доступа к DataContext, который, я бы сказал, является ключевой частью отделения нас от LINQ to SQL.