ݺߣ

ݺߣShare a Scribd company logo
МАИ, каф 806, Сети ЭВМ 
ENTERPRISE SERVICES 
com + 
1
МАИ, каф 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;
МАИ, каф 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.
МАИ, каф 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 МАИ, каф 806, Сети ЭВМ 
.NET Enterprise Services. Registry 
 В Windows Registry (HKEY_CLASSES_ROOT) хранятся 
ссылки на 
 
Библиотеки типов COM 
 
Классы COM 
 
Интерфейсы COM 
 После своего создания любое COM приложение должно 
быть зарегистрировано в Registry 
 
с помощью утилит: 
• regsvr32.exe (обычные компоненты) 
• regsvcs.exe (.NET) 
1.
МАИ, каф 806, Сети ЭВМ 6 
.NET Enterprise Services. Простой пример COM+ компонента
МАИ, каф 806, Сети ЭВМ 7 
.NET Enterprise Services. Простой пример COM+ компонента 
Выполняется для 
 COM-классов 
 COM-интерфейсов 
 Всей сборки
МАИ, каф 806, Сети ЭВМ 8 
.NET Enterprise Services.Простой пример COM+ компонента 
Написание класса-интерфейса 
1.usingSystem; 
2.usingSystem.Collections.Generic; 
3.usingSystem.Text; 
4.usingSystem.Runtime.InteropServices; 
5.namespace_13_COMServer 
6.{ 
7.[Guid("39A0CD49-CB4B-46ca-831C-375E50E8DEFE")] 
8.publicinterfaceIMyCOMServer 
9.{ 
10.StringdoSomeAction(); 
11.} 
12.}
МАИ, каф 806, Сети ЭВМ 9 
.NET Enterprise Services. Простой пример COM+ компонента 
Написание класса COMобъекта 
1.usingSystem; 
2.usingSystem.Collections.Generic; 
3.usingSystem.Text; 
4.usingSystem.EnterpriseServices; 
5.usingSystem.Runtime.InteropServices; 
6.namespace_13_COMServer 
7.{ 
8.[Transaction(TransactionOption.Disabled)] 
9.[ClassInterface(ClassInterfaceType.AutoDual)] 
10.[Guid("F79A8505-D2AA-4504-8794-6D85498FE0B6")] 
11.publicclassMyCOMServerImpl: ServicedComponent,IMyCOMServer 
12.{ 
13.publicMyCOMServerImpl() : base() 
14.{ 
15.} 
16.publicstringdoSomeAction() 
17.{ 
18.return"Hello World!"; 
19.} 
20.} 
21.}
МАИ, каф 806, Сети ЭВМ 10 
.NET Enterprise Services. Простой пример COM+ компонента 
Устанавливаем свойства сборки 
1.usingSystem.Reflection; 
2.usingSystem.Runtime.CompilerServices; 
3.usingSystem.Runtime.InteropServices; 
4.usingSystem.EnterpriseServices; 
5.[assembly: AssemblyTitle("013_COMServer")] 
6.[assembly: AssemblyDescription("")] 
7.[assembly: AssemblyConfiguration("")] 
8.[assembly: AssemblyCompany("")] 
9.[assembly: AssemblyProduct("013_COMServer")] 
10.[assembly: AssemblyCopyright("Copyright © 2007")] 
11.[assembly: AssemblyTrademark("")] 
12.[assembly: AssemblyCulture("")] 
13.[assembly: ComVisible(true)] 
14.[assembly: ApplicationActivation(ActivationOption.Library)] 
15.[assembly: ApplicationAccessControl(false)] 
16.[assembly: Guid("bbbc01b2-5eb5-4309-9d65-182e2b2f10ed")] 
17.[assembly: AssemblyVersion("1.0.0.0")] 
18.[assembly: AssemblyFileVersion("1.0.0.0")]
МАИ, каф 806, Сети ЭВМ 11 
.NET Enterprise Services. . Простой пример COM+ компонента 
Генерирование Strong Name
МАИ, каф 806, Сети ЭВМ 12 
.NET Enterprise Services. Простой пример COM+ компонента 
Установка признака видимости сборки 
Регистрация COM+ с помощью regsvcs.exe
МАИ, каф 806, Сети ЭВМ 13 
.NET Enterprise Services. Простой пример COM+ компонента
МАИ, каф 806, Сети ЭВМ 14 
.NET Enterprise Services. Простой пример COM+ компонента 
Удобный вызывать COM+ компоненты удаленно –PROXY 
Proxy создается на машине с установленным COM+ объектом через приложение Component Services 
Proxy -это инсталлятор который генерирует COM+ объект на локальной машине, который вызывает настоящий COM+ объект.
МАИ, каф 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.}
МАИ, каф 806, Сети ЭВМ 16 
.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.// Получаемтипком-объектаизегоCLSID... 
12.Typetype = Type.GetTypeFromCLSID(newGuid("F79A8505-D2AA-4504-8794-6D85498FE0B6"), "localhost"); 
13.// Создаемэкземпляр... 
14._13_COMServer.IMyCOMServersrv = (_13_COMServer.IMyCOMServer)Activator.CreateInstance(type); 
15.Console.WriteLine(srv.doSomeAction()); 
16.Console.ReadLine(); 
17.ServicedComponent.DisposeObject((ServicedComponent)srv); 
18.} 
19.} 
20.}
МАИ, каф 806, Сети ЭВМ 17 
.NET Enterprise Services.Поддержка транзакций 
Атрибут класса 
 [Transaction(TransactionOption.Required)] 
Атрибут метода 
 [AutoComplete] 
Явное управление 
 ContextUtil.SetComplete(); 
 ContextUtil.Abort(); 
1.
МАИ, каф 806, Сети ЭВМ 
TransactionOption 
Значение 
Описание 
Required 
Если вызывающий контекст содержит транзакцию, то используется он. Еслинет –то создается новый с транзакцией. 
RequiresNew 
Всегда создается новый с транзакцией. 
Supported 
Если вызывающий контекст с транзакцией, то выполняется в рамках транзакции. 
NotSupported 
Ни когда не участвует в транзакции (если вызван в транзакции, то создаетсяновый контекст без транзакции). 
Disabled 
Игнорируетсяесть ли транзакция в вызывающем компоненте или нет. 
18
МАИ, каф 806, Сети ЭВМ 
Пример Required, Supported, NotSupported, RequiresNew 
19
МАИ, каф 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
МАИ, каф 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
МАИ, каф 806, Сети ЭВМ 
Синхронизация 
Activity –это логический домен, доступ к которому могут иметь только потоки с одним контекстом синхронизации. 
22
МАИ, каф 806, Сети ЭВМ 
SynchronizationOption 
Disabled Контекст синхронизации всегда игнорируется. 
NotSupported аналогично предыдущему случаю, однако если вызывающий контекст поддерживает синхронизацию, то создается новый без. 
Required Всегда используется контекст синхронизации. 
RequiresNew Всегда создается новый контекст синхронизации. 
SupportedЕсли вызывающий объект поддерживает синхронизацию –то работает в синхронизации, если нет, то без неё. 
23
МАИ, каф 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
МАИ, каф 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.}
МАИ, каф 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.}
МАИ, каф 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.}
МАИ, каф 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.}
МАИ, каф 806, Сети ЭВМ 
Ролевая безопасность 
Можно определить конкретных пользователей или набор ролей, которые могут иметь доступ к вашему приложению. 
[assembly: ApplicationAccessControl(true, AccessChecksLevel=AccessChecksLevelOption.ApplicationComponent)] 
Определение ролей 
[assembly: SecurityRole("Attendee", true)]// по умолчанию 
[assembly: SecurityRole("Assistant")] 
[assembly: SecurityRole("Curriculum Manager")] 
29
МАИ, каф 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.//...

More Related Content

МАИ, Сети ЭВМ, Лекция №5

  • 1. МАИ, каф 806, Сети ЭВМ ENTERPRISE SERVICES com + 1
  • 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-интерфейсов  Всей сборки
  • 8. МАИ, каф 806, Сети ЭВМ 8 .NET Enterprise Services.Простой пример COM+ компонента Написание класса-интерфейса 1.usingSystem; 2.usingSystem.Collections.Generic; 3.usingSystem.Text; 4.usingSystem.Runtime.InteropServices; 5.namespace_13_COMServer 6.{ 7.[Guid("39A0CD49-CB4B-46ca-831C-375E50E8DEFE")] 8.publicinterfaceIMyCOMServer 9.{ 10.StringdoSomeAction(); 11.} 12.}
  • 9. МАИ, каф 806, Сети ЭВМ 9 .NET Enterprise Services. Простой пример COM+ компонента Написание класса COMобъекта 1.usingSystem; 2.usingSystem.Collections.Generic; 3.usingSystem.Text; 4.usingSystem.EnterpriseServices; 5.usingSystem.Runtime.InteropServices; 6.namespace_13_COMServer 7.{ 8.[Transaction(TransactionOption.Disabled)] 9.[ClassInterface(ClassInterfaceType.AutoDual)] 10.[Guid("F79A8505-D2AA-4504-8794-6D85498FE0B6")] 11.publicclassMyCOMServerImpl: ServicedComponent,IMyCOMServer 12.{ 13.publicMyCOMServerImpl() : base() 14.{ 15.} 16.publicstringdoSomeAction() 17.{ 18.return"Hello World!"; 19.} 20.} 21.}
  • 10. МАИ, каф 806, Сети ЭВМ 10 .NET Enterprise Services. Простой пример COM+ компонента Устанавливаем свойства сборки 1.usingSystem.Reflection; 2.usingSystem.Runtime.CompilerServices; 3.usingSystem.Runtime.InteropServices; 4.usingSystem.EnterpriseServices; 5.[assembly: AssemblyTitle("013_COMServer")] 6.[assembly: AssemblyDescription("")] 7.[assembly: AssemblyConfiguration("")] 8.[assembly: AssemblyCompany("")] 9.[assembly: AssemblyProduct("013_COMServer")] 10.[assembly: AssemblyCopyright("Copyright © 2007")] 11.[assembly: AssemblyTrademark("")] 12.[assembly: AssemblyCulture("")] 13.[assembly: ComVisible(true)] 14.[assembly: ApplicationActivation(ActivationOption.Library)] 15.[assembly: ApplicationAccessControl(false)] 16.[assembly: Guid("bbbc01b2-5eb5-4309-9d65-182e2b2f10ed")] 17.[assembly: AssemblyVersion("1.0.0.0")] 18.[assembly: AssemblyFileVersion("1.0.0.0")]
  • 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.}
  • 16. МАИ, каф 806, Сети ЭВМ 16 .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.// Получаемтипком-объектаизегоCLSID... 12.Typetype = Type.GetTypeFromCLSID(newGuid("F79A8505-D2AA-4504-8794-6D85498FE0B6"), "localhost"); 13.// Создаемэкземпляр... 14._13_COMServer.IMyCOMServersrv = (_13_COMServer.IMyCOMServer)Activator.CreateInstance(type); 15.Console.WriteLine(srv.doSomeAction()); 16.Console.ReadLine(); 17.ServicedComponent.DisposeObject((ServicedComponent)srv); 18.} 19.} 20.}
  • 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.//...