, Inversion of Control / ?
, , IOC, .
:
public enum SecurityLevels
{
publicLevel = 0,
userLevel,
adminLevel
}
VM ( , ?) , , / . , VM IAuthorize.
public interface IAuthorize
{
SecurityLevels CurrentLevel { get; set; }
bool GetAuthorization(IAmIAuthorized instance);
}
IAmIAuthorized (Am-I-Authorized) , , . Injection Dependency DetermineAuthorizationFunc, VM Injection Dependency:
public interface IAmIAuthorized
{
SecurityLevels Level { get; }
Visibility IsVisible { get; }
bool IsAuthorized { get; }
Func<IAmIAuthorized, bool> DetermineAuthorizationFunc { get; set; }
}
, , IAmIAuthorzied DetermineAuthorizationFunc, . , , DetermineAuthorizationFunc.
Xaml , , IsVisible Visibility VM .
<TextBlock Text="{Binding Name}" Visibility="{Binding IsVisible}" />
IOC .
OP VariableDataItem :
public class VariableDataItem : IAmIAuthorized
{
public string Name { get; set; }
public SecurityLevels Level { get; set; }
public Func<IAmIAuthorized, bool> DetermineAuthorizationFunc { get; set; }
public bool IsAuthorized
{
get { return DetermineAuthorizationFunc != null &&
DetermineAuthorizationFunc(this); }
}
public Visibility IsVisible
{
get { return IsAuthorized ? Visibility.Visible : Visibility.Hidden; }
}
}
VM
Holdings = new List<VariableDataItem>()
{
new VariableDataItem() {Name = "Alpha", DetermineAuthorizationFunc = GetAuthorization, Level = SecurityLevels.publicLevel },
new VariableDataItem() {Name = "Beta", DetermineAuthorizationFunc = GetAuthorization, Level = SecurityLevels.userLevel },
new VariableDataItem() {Name = "Gamma", DetermineAuthorizationFunc = GetAuthorization, Level = SecurityLevels.adminLevel }
};
IOC:
public bool GetAuthorization(IAmIAuthorized instance)
{
return (int)instance.Level <= (int)CurrentLevel;
}
In this system, if the current state userLevel, our list will show only Alpha (which is publicly available) and Beta (which is a user), but not Gamma, which is only an administrator:

The administrator can see everything:
