Figure 3 Declarative Attributes for Classes
Attribute Class
|
Controls
|
Applies To
|
AutoCompleteAttribute
|
Auto-completion of declarative transactions
|
Method
|
ComponentAccessControlAttribute
|
Class-level access control
|
Class
|
ConstructionEnabledAttribute
|
Object construction (construct string)
|
Class
|
EventTrackingAttribute
|
Events and Statistics
|
Class
|
JustInTimeActivationAttribute
|
Just-in-time (JIT) activation
|
Class
|
MustRunInClientContextAttribute
|
Mandatory activation in client's context
|
Class
|
ObjectPoolingAttribute
|
Object pooling
|
Class
|
SecurityRoleAttribute
|
Role memberships and declarative tests
|
Class
|
TransactionAttribute
|
Declarative transactions
|
Class
|
Figure 4 Declarative Attributes for Applications
Attribute Class
|
Controls
|
ApplicationAccessControlAttribute
|
Security settings (except identity)
|
ApplicationActivationAttribute
|
Activation mode, either library or server
|
ApplicationIDAttribute
|
Unique ID
|
ApplicationNameAttribute
|
Name
|
Figure 5 ContextUtil Methods and Properties
Method or Property
|
Object Context Interface and Method
|
DisableCommit
|
IObjectControl::DisableCommit
|
EnableCommit
|
IObjectControl::EnableCommit
|
GetNamedProperty
|
IGetContextProperties::GetProperty
|
IsCallerInRole
|
IObjectContext::IsCallerInRole
|
SetAbort
|
IObjectControl::SetAbort
|
SetComplete
|
Object context interface and method
|
ActivityId
|
IObjectContextInfo::GetActivityId
|
ContextId
|
IObjectContextInfo::GetContextId
|
DeactivateOnReturn
|
IConextState::Get/StateDeactivateOnReturn
|
IsInTransaction
|
IObjectContextInfo::IsInTransaction
|
IsSecurityEnabled
|
IObjectContext::IsSecurityEnabled
|
MyTransactionVote
|
IContextState::Get/SetMyTransactionVote
|
Transaction
|
IObjectContextInfo::GetTransaction
|
TransactionId
|
IObjectContextInfo::GetTransactionId
|
Figure 6 Managing a Declarative Transaction
[ Transaction(TransactionOption.Required) ]
public class MyTxCfgClass : ServicedComponent
{
public MyTxCfgClass() {}
public void DoTxWork()
{
// set done bit so transaction ends at
// end of method
ContextUtil.DeactivateOnReturn = true;
// clear happy bit so transaction aborts
// if exception is thrown
ContextUtil.MyTransactionVote = TransactionVote.Abort;
... // use ADO.NET to work with databases
// set happy bit so transaction can commit
ContextUtil.MyTransactionVote = TransactionVote.Commit;
}
}
Figure 7 SecurityCallContext Methods and Properties
Method or Property
|
Call Context Interface and Method
|
IsCallerInRole
|
ISecurityCallContext::IsCallerInRole
|
IsUserInRole
|
ISecurityCallContext::IsUserInRole
|
Callers
|
ISecurityCallContext::get_Item("Callers")
|
CurrentCaller
|
CoGetCallContext
|
DirectCaller
|
ISecurityCallContext::get_Item("DirectCaller")
|
IsSecurityEnabled
|
ISecurityCallContext::IsSecurityEnabled
|
MinAuthenticationLevel
|
ISecurityCallContext::get_Item("MinAuthenticationLevel")
|
NumCallers
|
ISecurityCallContext::get_Item("NumCallers")
|
Original Caller
|
ISecurityCallContext::get_Item("OriginalCaller")
|
Figure 8 Retrieving the Caller's Name
using System.EnterpriseServices;
[assembly: ApplicationName("MyApp")]
[assembly: ApplicationActivation(ActivationOption.Library)]
[assembly: ApplicationAccessControl(false,
AccessChecksLevel =
AccessChecksLevelOption.ApplicationComponent)]
namespace ESExample
{
[ Synchronization(SynchronizationOption.Required) ]
public class MyCfgClass : ServicedComponent
{
public MyCfgClass() {}
public string GetCallerName()
{
return SecurityCallContext.CurrentCall.OriginalCaller.AccountName;
}
}
}
Figure 10 Static Methods and Properties
[ Synchronization(SynchronizationOption.Required) ]
public class MyCfgClass : ServicedComponent
{
public MyCfgClass() {}
// executes in object's context
public void One() { ... }
// executes in caller's context
public static void Two() { ... }
// executes in object's context
public string Three { ... }
// executes in caller's context
public static string Four { ... }
}
public class Client
{
public static void Main(string[] args)
{
MyCfgClass cc = new MyCfgClass();
// executes in object's context
cc.One();
// executes in caller's context
MyCfgClass.Two();
// executes in object's context
cc.Three = "red pill";
// executes in caller's context
MyCfgClass.Four = "blue pill";
}
}
|