2. МАИ, каф 806, Сети ЭВМ 2
.NET Enterprise Services. COM Базовые идеи
Component Object Model (COM) создан в 1993 году для упрощения межмодульного взаимодействия и управления временем жизни объектов;
Непривязанный к языкам программирования способ описания объектов (компонентов);
Включает:
Поддерживает большое число языков программирования;
Автоматическое управление временем жизни объекта через подсчет ссылок на объектIUnknown;
Поддерживает работу с описанием объекта (IDL);
Поддерживает наследование интерфейсов;
Поддерживает позднее связывание;
Поддерживает создание многопоточных приложений;
Поддерживает распределенные транзакций с помощью MTS;
Используется в основном только в OS Windows (95/98/NT/2000/2003/XP/Vista/2008/2012/7/8/10/Windows Phone 8);
Альтернативными COM технологиями являются CORBA и JavaBeans;
3. МАИ, каф 806, Сети ЭВМ 3
.NET Enterprise Services.COM основы.
Программы строятся как набор взаимодействующих COM компонент.
Компоненты идентифицируются с помощью идентификаторов GUID (Globally Unique Identifiers). Например, B058D6F9-AC1C-4369-A2C1-CD1DA693EE16;
Каждый компонент предоставляет набор интерфейсов, для доступа к своей функциональности;
Каждый интерфейс идентифицируется с помощью идентификаторов GUID;
Интерфейсы
Наследуются от стандартного интерфейса IUnknown;
IUnknown состоит из методов:
•AddRef;
•Release;
•QueryInterface;
Интерфейс должен удовлетворять свойствам:
•Рефлективности (если у интерфейса запросить его же, то он вернет себя);
•Симметрии (если интерфейс А доступен из B, тогда и B доступен из A);
•Транзитивности(если A доступен из B, B доступен изC, то и А доступен из C);
1.
4. МАИ, каф 806, Сети ЭВМ 4
.NET Enterprise Services. IDL
IDL позволяет описывать интерфейсы, типы и структуры данных;
IDL может быть конвертирован в TLB файл (type library).Которая может быть использована для компеляции в конкретный язык программирования;
Пример
1.import "oaidl.idl";
2.import "ocidl.idl";
3.[object,
4.uuid(2FFB4D41-052A-497C-BE43-71B1D09B6360),
5.helpstring(" IMyInterfaceInterface"),
6.pointer_default(unique)]
7.interface IMyInterface: IUnknown
8.{
9.[helpstring("method DoSomething")]
10.HRESULT DoSomething([in] LPOLESTR word, [out,retval] VARIANT_BOOL *result);
11.};
12.[ uuid(3FED244E-4367-4C8F-932C-C0DF67BEBAFC),
13.version(1.0),
14.helpstring(“MyClass1.0 Type Library") ]
15.library ATLSPELLCHECKLib
16.{
17.importlib("stdole32.tlb");
18.importlib("stdole2.tlb");
19.[ uuid(3D233E11-3661-4EA5-87C8-ABCFCFEE76BF), helpstring("Мой класс") ]
20.coclass MyClass{ [default] interface IMyInterface; };
21.};
5. 5 МАИ, каф 806, Сети ЭВМ
.NET Enterprise Services. Registry
В Windows Registry (HKEY_CLASSES_ROOT) хранятся
ссылки на
Библиотеки типов COM
Классы COM
Интерфейсы COM
После своего создания любое COM приложение должно
быть зарегистрировано в Registry
с помощью утилит:
• regsvr32.exe (обычные компоненты)
• regsvcs.exe (.NET)
1.
6. МАИ, каф 806, Сети ЭВМ 6
.NET Enterprise Services. Простой пример COM+ компонента
7. МАИ, каф 806, Сети ЭВМ 7
.NET Enterprise Services. Простой пример COM+ компонента
Выполняется для
COM-классов
COM-интерфейсов
Всей сборки
11. МАИ, каф 806, Сети ЭВМ 11
.NET Enterprise Services. . Простой пример COM+ компонента
Генерирование Strong Name
12. МАИ, каф 806, Сети ЭВМ 12
.NET Enterprise Services. Простой пример COM+ компонента
Установка признака видимости сборки
Регистрация COM+ с помощью regsvcs.exe
13. МАИ, каф 806, Сети ЭВМ 13
.NET Enterprise Services. Простой пример COM+ компонента
14. МАИ, каф 806, Сети ЭВМ 14
.NET Enterprise Services. Простой пример COM+ компонента
Удобный вызывать COM+ компоненты удаленно –PROXY
Proxy создается на машине с установленным COM+ объектом через приложение Component Services
Proxy -это инсталлятор который генерирует COM+ объект на локальной машине, который вызывает настоящий COM+ объект.
15. МАИ, каф 806, Сети ЭВМ 15
.NET Enterprise Services. Простой пример COM+ компонента
Клиент (вариант с Proxy)
1.usingSystem;
2.usingSystem.Collections.Generic;
3.usingSystem.Text;
4.usingSystem.EnterpriseServices;
5.namespace_14_COMClient
6.{
7.classProgram
8.{
9.staticvoidMain(string[] args)
10.{
11._13_COMServer.IMyCOMServersrv = new_13_COMServer.MyCOMServerImpl();
12.Console.WriteLine(srv.doSomeAction());
13.Console.ReadLine();
14.ServicedComponent.DisposeObject((ServicedComponent)srv);
15.}
16.}
17.}
17. МАИ, каф 806, Сети ЭВМ 17
.NET Enterprise Services.Поддержка транзакций
Атрибут класса
[Transaction(TransactionOption.Required)]
Атрибут метода
[AutoComplete]
Явное управление
ContextUtil.SetComplete();
ContextUtil.Abort();
1.
18. МАИ, каф 806, Сети ЭВМ
TransactionOption
Значение
Описание
Required
Если вызывающий контекст содержит транзакцию, то используется он. Еслинет –то создается новый с транзакцией.
RequiresNew
Всегда создается новый с транзакцией.
Supported
Если вызывающий контекст с транзакцией, то выполняется в рамках транзакции.
NotSupported
Ни когда не участвует в транзакции (если вызван в транзакции, то создаетсяновый контекст без транзакции).
Disabled
Игнорируетсяесть ли транзакция в вызывающем компоненте или нет.
18
19. МАИ, каф 806, Сети ЭВМ
Пример Required, Supported, NotSupported, RequiresNew
19
20. МАИ, каф 806, Сети ЭВМ
AutoComplete
[AutoComplete]
public void AddCourse(Course c)
{
try
{
CourseData db = new CourseData(connectionString);
db.AddCourse(c);
} catch (Exception ex)
{
// do some event logging
// re-throw exception
throw;
}
}
20
21. МАИ, каф 806, Сети ЭВМ
Транзакции в .NET
using System;
using System.Transactions;
class TxDemo {
static void Main() {
using (TransactionScopescope =
new TransactionScope( TransactionScopeOption.Required))
{
Course c = new Course();
c.Title = ".NET Enterprise Services";
CourseData db = new CourseData(connectionString);
db.AddCourse(c);
scope.Complete();
}
}
}
21
22. МАИ, каф 806, Сети ЭВМ
Синхронизация
Activity –это логический домен, доступ к которому могут иметь только потоки с одним контекстом синхронизации.
22
23. МАИ, каф 806, Сети ЭВМ
SynchronizationOption
Disabled Контекст синхронизации всегда игнорируется.
NotSupported аналогично предыдущему случаю, однако если вызывающий контекст поддерживает синхронизацию, то создается новый без.
Required Всегда используется контекст синхронизации.
RequiresNew Всегда создается новый контекст синхронизации.
SupportedЕсли вызывающий объект поддерживает синхронизацию –то работает в синхронизации, если нет, то без неё.
23
24. МАИ, каф 806, Сети ЭВМ
Пример
[Synchronization(SynchronizationOption.Required)]
[EventTrackingEnabled]
public class B : ServicedComponent
{
public void Sleep()
{
Console.WriteLine("B.Sleep started");
Thread.Sleep(2000);
Console.WriteLine("B.Sleep finished");
}
public Guid GetActivityId()
{
return ContextUtil.ActivityId;
}
}
24
25. МАИ, каф 806, Сети ЭВМ 25
.NET Enterprise Services. Управление активацией объекта
При активации могут передаваться параметры в строке активации
1.[ConstructionEnabled(Default=@"C:temp")]
2.[EventTrackingEnabled]
3.public class CoursesComponent : ServicedComponent
4.{
5.private string path;
6.public CoursesComponent()
7.{
8.}
9.protected override void Construct(string s)
10.{
11.path = s;
12.}
13.private void CreateFile()
14.{
15.string uniqueName = Guid.NewGuid().ToString();
16.writer = new StreamWriter(path + @"Courses " +
17.uniqueName + ".txt");
18.}
26. МАИ, каф 806, Сети ЭВМ 26
.NET Enterprise Services.Управление временем жизни объекта
Есть возможность перехватывать события, когда объект становится активным или неактивным
1.[JustInTimeActivation()]
2.Class …{
3.protected override void Activate()
4.{
5.}
6.protected override void Deactivate()
7.{
8.}
9.public void Method2()
10.{
11.// state will not be available after the method completes
12.ContextUtil.DeactivateOnReturn = true;
13.}
14.}
27. МАИ, каф 806, Сети ЭВМ 27
.NET Enterprise Services.Управление пулом объектов
Есть возможность управлять числом объектов, которые постоянно хранятся в памяти
Позволяет ускорить обработку запросов
1.[ObjectPooling(true, 100, 1000)]
2.protected override bool CanBePooled()
3.{
4.if (usageCount > 10)
5.{
6.// the object should not be put back into the pool
7.return false;
8.}
9.else
10.{
11.// returning the object into the pool is OK
12.return true;
13.}
14.}
28. МАИ, каф 806, Сети ЭВМ 28
.NET Enterprise Services.Dispose паттерн
Очень важно правильно управлять высвобождением ресурсов
1.public class Resource : IDisposable
2.{
3.public Resource()
4.{ // allocate resource
5.}
6.~Resource()
7.{ // this is called by the garbage collector
8.Dispose(false);
9.}
10.public void Dispose()
11.{
12.// this is called by the programmer
13.Dispose(true)
14.}
15.protected virtual void Dispose(bool disposing)
16.{
17.if (disposing)
18.{
19.// free embedded resources
20.GC.SuppressFinalize(this);
21.}
22.// embedded resources are freed by the garbage collector
23.// don't access embedded references here
24.}
25.}
29. МАИ, каф 806, Сети ЭВМ
Ролевая безопасность
Можно определить конкретных пользователей или набор ролей, которые могут иметь доступ к вашему приложению.
[assembly: ApplicationAccessControl(true, AccessChecksLevel=AccessChecksLevelOption.ApplicationComponent)]
Определение ролей
[assembly: SecurityRole("Attendee", true)]// по умолчанию
[assembly: SecurityRole("Assistant")]
[assembly: SecurityRole("Curriculum Manager")]
29
30. МАИ, каф 806, Сети ЭВМ
Проверка прав в приложении
1.public void SetAllowance(Customer customer, float allowance)
2.{
3.if (allowance > maxNormalAllowance)
4.{
5.if (!ContextUtil.IsCallerInRole("Supervisor"))
6.throw new UnauthorizedAccessException(
7."You are not allowed to give that much " +
8."allowance. Contact the supervisor");
9.}
10.}
30
1.[SecurityRole("Attendee")]
2.[SecurityRole("Assistant")]
3.public interface ICourseRegistration
4.{
5.[SecureMethod()]
6.void RegisterCourse(CourseRegistration courseRegistration);
7.}
8.[SecurityRole("Curriculum Manager")]
9.[Transaction(TransactionOption.Required)]
10.public class CourseControl : ServicedComponent, ICourseRegistration
11.{
12.//...