В основном один находится в присутствии контекста сохранения JTA, управляемого контейнером, с транзакциями, управляемыми бобами (BMT).
Поэтому, помимо вашего EntityManager
, вы также должны ввести в свой DataFetchBean
ваш UserTransaction
, чтобы начать, совершить или отменить транзакцию.
@Named
@RequestScoped
public class DataFetchBean {
@PersistenceContext
EntityManager em;
@Resource
private UserTransaction userTransaction;
...
}
Затем, в вашем addEmployee
методе, вы должны начать и затем совершить транзакцию, поэтому ваши изменения на ваш сотрудник может быть распространен в базу данных.
public void addEmployee() throws Exception {
Employee employee = new Employee(500000, new Date(335077446), "Josh", "Carribean", 'm', new Date(335077446));
userTransaction.beginTransaction();
em.persist(employee);
userTransaction.commit();
}
Несмотря на это, вам следует подумать о переносе действий базы данных в EJB, вставляя их в свой JSF-компонент, поэтому делегирование на контейнере (например, использовать CMT вместо ручной обработки).
Теперь, когда у нас есть лямбда-выражения и анонимные методы в C#, я использую, делегирует намного больше. В C# 1, где у Вас всегда должен был быть отдельный метод реализовать логику, с помощью делегата часто, не имел смысла. В эти дни я использую делегатов к:
Параметрический усилитель сравнения в В Массиве. Вид (T [] массив, сравнение Сравнения), Список. Вид (Сравнение сравнения), и т.д.
Использование делегатов
Ленивая инициализация параметра! Помимо всех предыдущих ответов (стратегическая модель, шаблон "наблюдатель", и т.д.), делегаты позволяют Вам обрабатывать ленивую инициализацию параметров. Например, предположите, что у Вас есть функциональная Загрузка (), который занимает довольно много времени и возвращает определенный DownloadedObject. Этот объект используется устройством хранения данных в зависимости от определенные условия. Как правило, Вы были бы:
storage.Store(conditions, Download(item))
Однако с делегатами (более точно, лямбды) можно сделать следующее путем изменения подписи хранилища так, чтобы это получило Условие и Func< Объект, DownloadedObject> и используйте его как это:
storage.Store(conditions, (item) => Download(item))
Поэтому устройство хранения данных только оценит делегата при необходимости, выполняя загрузку в зависимости от Условий.
Любое время Вы хотите инкапсулировать поведение, но вызвать его универсальным способом. Обработчики событий, функции обратного вызова, и т.д. Можно выполнить подобные вещи Интерфейсы использования и броски, но иногда, поведение не обязательно связывается с объект типа или . Иногда у Вас просто есть поведение, которое необходимо инкапсулировать.
Первая строка использования должна заменить The Observer / Заметный (события) шаблон. Второе, хорошая изящная версия Стратегической модели. Различные другие использования могут быть собраны, хотя более тайный, чем эти первые два, я думаю.
Я использую делегатов для передачи с потоками.
, Например, у меня могло бы быть приложение форм победы, которое загружает файл. Приложение запускает рабочий поток, чтобы сделать загрузку (который препятствует тому, чтобы GUI заперся). Рабочий поток использует делегатов для отправки сообщений о состоянии (например, прогресс загрузки) назад к основной программе, так, чтобы GUI мог обновить строку состояния.
Для обработчика событий
Для передачи метода в методе параметры
Немного отличающееся использование должно ускорить отражение; т.е. вместо того, чтобы использовать отражение каждый раз, можно использовать Delegate.CreateDelegate
для создания (введенного) делегата в методе (MethodInfo
), и вызов тот делегат вместо этого. Это тогда очень более быстро на вызов, поскольку проверки были уже сделаны.
С Expression
, можно также сделать то же для создания кода на лету - например, можно легко создать Expression
, который представляет + оператор для типа, выбранного во времени выполнения (для оказания поддержки оператора для дженериков, которые язык не обеспечивает); и можно скомпилировать Expression
во введенного делегата - сделанное задание.
Можно использовать делегатов для объявления функциональных переменных определенного типа и параметров.
Пример
Рассматривают "ресурс, одалживая" шаблон. Вы хотите управлять созданием и очисткой ресурса, позволяя клиентскому коду "одолжить" промежуточный ресурс.
Это объявляет тип делегата.
public delegate void DataReaderUser( System.Data.IDataReader dataReader );
Любой метод, соответствующий этой подписи, может использоваться для инстанцирования делегата этого типа. В C# 2.0 это может быть сделано неявно, просто при помощи названия метода, а также при помощи анонимных методов.
Этот метод использует тип в качестве параметра. Отметьте вызов делегата.
public class DataProvider
{
protected string _connectionString;
public DataProvider( string psConnectionString )
{
_connectionString = psConnectionString;
}
public void UseReader( string psSELECT, DataReaderUser readerUser )
{
using ( SqlConnection connection = new SqlConnection( _connectionString ) )
try
{
SqlCommand command = new SqlCommand( psSELECT, connection );
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while ( reader.Read() )
readerUser( reader ); // the delegate is invoked
}
catch ( System.Exception ex )
{
// handle exception
throw ex;
}
}
}
функция может быть вызвана с анонимным методом следующим образом. Обратите внимание, что анонимный метод может использовать переменные, объявил внешний из себя. Это чрезвычайно удобно (хотя пример немного изобретен).
string sTableName = "test";
string sQuery = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='" + sTableName + "'";
DataProvider.UseReader( sQuery,
delegate( System.Data.IDataReader reader )
{
Console.WriteLine( sTableName + "." + reader[0] );
} );
Найденный другим интересным ответом:
коллега А просто задал мне этот вопрос - какой смысл делегатов в.NET? Мой ответ был очень короток и тот, который он не нашел онлайн: задержать осуществление метода.
Источник: LosTechies
Точно так же, как LINQ делает.
Делегаты используются каждый раз, когда вы используете события - это механизм, с помощью которого они работают.
Кроме того, делегаты очень полезны для таких вещей, как использование запросов LINQ. Например, многие запросы LINQ принимают делегат (часто Func
), который можно использовать для фильтрации.
Делегаты часто могут использоваться вместо интерфейса с одним методом, типичным примером этого может быть шаблон наблюдателя. На других языках, если вы хотите получать уведомление о том, что что-то произошло, вы можете определить что-то вроде:
class IObserver{ void Notify(...); }
В C # это чаще выражается с помощью событий, где обработчик является делегатом, например:
myObject.SomeEvent += delegate{ Console.WriteLine("..."); };
Еще одно отличное место для используйте делегаты, если вам нужно передать предикат в функцию, например, при выборе набора элементов из списка:
myList.Where(i => i > 10);
Выше приведен пример синтаксиса лямбда, который также можно было бы записать следующим образом:
myList.Where(delegate(int i){ return i > 10; });
Еще одно место, где может быть полезно использовать делегаты, - это регистрация заводских функций, например:
myFactory.RegisterFactory(Widgets.Foo, () => new FooWidget());
var widget = myFactory.BuildWidget(Widgets.Foo);
Надеюсь, это поможет!
типичным примером этого может быть шаблон наблюдателя. На других языках, если вы хотите получать уведомление о том, что что-то произошло, вы можете определить что-то вроде:class IObserver{ void Notify(...); }
В C # это чаще выражается с помощью событий, где обработчик является делегатом, например:
myObject.SomeEvent += delegate{ Console.WriteLine("..."); };
Еще одно отличное место для используйте делегаты, если вам нужно передать предикат в функцию, например, при выборе набора элементов из списка:
myList.Where(i => i > 10);
Выше приведен пример синтаксиса лямбда, который также можно было бы записать следующим образом:
myList.Where(delegate(int i){ return i > 10; });
Еще одно место, где может быть полезно использовать делегаты, - это регистрация заводских функций, например:
myFactory.RegisterFactory(Widgets.Foo, () => new FooWidget());
var widget = myFactory.BuildWidget(Widgets.Foo);
Надеюсь, это поможет!
типичным примером этого может быть шаблон наблюдателя. На других языках, если вы хотите получать уведомление о том, что что-то произошло, вы можете определить что-то вроде:class IObserver{ void Notify(...); }
В C # это чаще выражается с помощью событий, где обработчик является делегатом, например:
myObject.SomeEvent += delegate{ Console.WriteLine("..."); };
Еще одно отличное место для используйте делегаты, если вам нужно передать предикат в функцию, например, при выборе набора элементов из списка:
myList.Where(i => i > 10);
Выше приведен пример синтаксиса лямбда, который также можно было бы записать следующим образом:
myList.Where(delegate(int i){ return i > 10; });
Еще одно место, где может быть полезно использовать делегаты, - это регистрация заводских функций, например:
myFactory.RegisterFactory(Widgets.Foo, () => new FooWidget());
var widget = myFactory.BuildWidget(Widgets.Foo);
Надеюсь, это поможет!
Делегаты очень полезны для многих целей.
Одна из таких целей - использовать их для фильтрации последовательностей данных. В этом случае вы должны использовать делегат предиката, который принимает один аргумент и возвращает истину или ложь в зависимости от реализации самого делегата.
Вот глупый пример - я уверен, что вы можете экстраполировать что-то более полезное из этого:
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<String> names = new List<String>
{
"Nicole Hare",
"Michael Hare",
"Joe Hare",
"Sammy Hare",
"George Washington",
};
// Here I am passing "inMyFamily" to the "Where" extension method
// on my List<String>. The C# compiler automatically creates
// a delegate instance for me.
IEnumerable<String> myFamily = names.Where(inMyFamily);
foreach (String name in myFamily)
Console.WriteLine(name);
}
static Boolean inMyFamily(String name)
{
return name.EndsWith("Hare");
}
}
Насколько я знаю, делегаты могут быть преобразованы в указатели на функции. Это НАМНОГО упрощает жизнь при взаимодействии с нативным кодом, который принимает указатели на функции, поскольку они могут быть эффективно объектно-ориентированными, хотя первоначальный программист не предусмотрел для этого никаких условий.