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

30
МАИ, каф 806, Сети ЭВМ ENTERPRISE SERVICES com + 1

description

Основы построения сервисов COM+.

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

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

МАИ, каф 806, Сети ЭВМ

ENTERPRISE SERVICES

com +

1

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

МАИ, каф 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;

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

МАИ, каф 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.

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

МАИ, каф 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(" IMyInterface Interface"),

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(“MyClass 1.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. };

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

МАИ, каф 806, Сети ЭВМ5

.NET Enterprise Services. Registry

В Windows Registry (HKEY_CLASSES_ROOT) хранятся

ссылки на

Библиотеки типов COM

Классы COM

Интерфейсы COM

После своего создания любое COM приложение должно

быть зарегистрировано в Registry

с помощью утилит:

• regsvr32.exe (обычные компоненты)

• regsvcs.exe (.NET)

1.

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

МАИ, каф 806, Сети ЭВМ6

.NET Enterprise Services. Простой пример COM+ компонента

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

МАИ, каф 806, Сети ЭВМ7

.NET Enterprise Services. Простой пример COM+ компонента

Выполняется для

COM-классов

COM-интерфейсов

Всей сборки

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

МАИ, каф 806, Сети ЭВМ8

.NET Enterprise Services. Простой пример COM+ компонента

Написание класса-интерфейса

1. using System;

2. using System.Collections.Generic;

3. using System.Text;

4. using System.Runtime.InteropServices;

5. namespace _13_COMServer

6. {

7. [Guid("39A0CD49-CB4B-46ca-831C-375E50E8DEFE")]

8. public interface IMyCOMServer

9. {

10. String doSomeAction();

11. }

12.}

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

МАИ, каф 806, Сети ЭВМ9

.NET Enterprise Services. Простой пример COM+ компонента

Написание класса COM объекта

1. using System;

2. using System.Collections.Generic;

3. using System.Text;

4. using System.EnterpriseServices;

5. using System.Runtime.InteropServices;

6. namespace _13_COMServer

7. {

8. [Transaction(TransactionOption.Disabled)]

9. [ClassInterface(ClassInterfaceType.AutoDual)]

10. [Guid("F79A8505-D2AA-4504-8794-6D85498FE0B6")]

11. public class MyCOMServerImpl : ServicedComponent,IMyCOMServer

12. {

13. public MyCOMServerImpl() : base()

14. {

15. }

16. public string doSomeAction()

17. {

18. return "Hello World!";

19. }

20. }

21. }

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

МАИ, каф 806, Сети ЭВМ10

.NET Enterprise Services. Простой пример COM+ компонента

Устанавливаем свойства сборки

1. using System.Reflection;

2. using System.Runtime.CompilerServices;

3. using System.Runtime.InteropServices;

4. using System.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")]

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

МАИ, каф 806, Сети ЭВМ11

.NET Enterprise Services. . Простой пример COM+ компонента

Генерирование Strong Name

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

МАИ, каф 806, Сети ЭВМ12

.NET Enterprise Services. Простой пример COM+ компонента

Установка признака видимости сборки

Регистрация COM+ с помощью regsvcs.exe

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

МАИ, каф 806, Сети ЭВМ13

.NET Enterprise Services. Простой пример COM+ компонента

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

МАИ, каф 806, Сети ЭВМ14

.NET Enterprise Services. Простой пример COM+ компонента

Удобный вызывать COM+

компоненты удаленно – PROXY

Proxy создается на машине с

установленным COM+ объектом

через приложение Component

Services

Proxy - это инсталлятор который

генерирует COM+ объект на

локальной машине, который

вызывает настоящий COM+

объект.

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

МАИ, каф 806, Сети ЭВМ15

.NET Enterprise Services. Простой пример COM+ компонента

Клиент (вариант с Proxy)

1. using System;

2. using System.Collections.Generic;

3. using System.Text;

4. using System.EnterpriseServices;

5. namespace _14_COMClient

6. {

7. class Program

8. {

9. static void Main(string[] args)

10. {

11. _13_COMServer.IMyCOMServer srv = new _13_COMServer.MyCOMServerImpl();

12. Console.WriteLine(srv.doSomeAction());

13. Console.ReadLine();

14. ServicedComponent.DisposeObject((ServicedComponent)srv);

15. }

16. }

17. }

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

МАИ, каф 806, Сети ЭВМ16

.NET Enterprise Services. Простой пример COM+ компонента

Клиент (вариант без Proxy)

1. using System;

2. using System.Collections.Generic;

3. using System.Text;

4. using System.EnterpriseServices;

5. namespace _14_COMClient

6. {

7. class Program

8. {

9. static void Main(string[] args)

10. {

11. // Получаем тип ком-объекта из его CLSID...

12. Type type = Type.GetTypeFromCLSID(new Guid("F79A8505-D2AA-4504-8794-6D85498FE0B6"), "localhost");

13. // Создаем экземпляр...

14. _13_COMServer.IMyCOMServer srv = (_13_COMServer.IMyCOMServer)Activator.CreateInstance(type);

15. Console.WriteLine(srv.doSomeAction());

16. Console.ReadLine();

17. ServicedComponent.DisposeObject((ServicedComponent)srv);

18. }

19. }

20. }

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

МАИ, каф 806, Сети ЭВМ17

.NET Enterprise Services. Поддержка транзакций

Атрибут класса

[Transaction(TransactionOption.Required)]

Атрибут метода

[AutoComplete]

Явное управление

ContextUtil.SetComplete();

ContextUtil.Abort();1.

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

МАИ, каф 806, Сети ЭВМ

TransactionOption

Значение Описание

Required Если вызывающий контекст содержит транзакцию,

то используется он. Если нет – то создается новый с

транзакцией.

RequiresNew Всегда создается новый с транзакцией.

Supported Если вызывающий контекст с транзакцией, то

выполняется в рамках транзакции.

NotSupported Ни когда не участвует в транзакции (если вызван в

транзакции, то создается новый контекст без

транзакции).

Disabled Игнорируется есть ли транзакция в вызывающем

компоненте или нет.

18

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

МАИ, каф 806, Сети ЭВМ

Пример Required, Supported, NotSupported, RequiresNew

19

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

МАИ, каф 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

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

МАИ, каф 806, Сети ЭВМ

Транзакции в .NET

using System;

using System.Transactions;

class TxDemo {

static void Main() {

using (TransactionScope scope =

new TransactionScope( TransactionScopeOption.Required))

{

Course c = new Course();

c.Title = ".NET Enterprise Services";

CourseData db = new CourseData(connectionString);

db.AddCourse(c);

scope.Complete();

}

}

}

21

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

МАИ, каф 806, Сети ЭВМ

Синхронизация

Activity – это логический домен, доступ к которому могут иметь только потоки с одним

контекстом синхронизации.

22

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

МАИ, каф 806, Сети ЭВМ

SynchronizationOption

Disabled

Контекст синхронизации всегда игнорируется.

NotSupported

аналогично предыдущему случаю, однако если вызывающий контекст поддерживает

синхронизацию, то создается новый без.

Required

Всегда используется контекст синхронизации.

RequiresNew

Всегда создается новый контекст синхронизации.

Supported

Если вызывающий объект поддерживает синхронизацию – то работает в синхронизации, если

нет, то без неё.

23

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

МАИ, каф 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

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

МАИ, каф 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. }

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

МАИ, каф 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. }

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

МАИ, каф 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.}

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

МАИ, каф 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. }

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

МАИ, каф 806, Сети ЭВМ

Ролевая безопасность

Можно определить конкретных пользователей или набор

ролей, которые могут иметь доступ к вашему

приложению.

[assembly: ApplicationAccessControl(true,

AccessChecksLevel=AccessChecksLevelOption.ApplicationC

omponent)]

Определение ролей

[assembly: SecurityRole("Attendee", true)] // по умолчанию

[assembly: SecurityRole("Assistant")]

[assembly: SecurityRole("Curriculum Manager")]

29

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

МАИ, каф 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. //...