Skip to content

Instantly share code, notes, and snippets.

@mikeminutillo
Created August 1, 2013 07:30
Show Gist options
  • Save mikeminutillo/6129195 to your computer and use it in GitHub Desktop.
Save mikeminutillo/6129195 to your computer and use it in GitHub Desktop.
Using Autofac resolution to set boolean flags indicating if the user is allowed to perform some action
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class PermissionAttribute : Attribute
{
public string RequiredPermission { get; set; }
public PermissionAttribute(string requiredPermission)
{
RequiredPermission = requiredPermission;
}
}
public interface IPermissionService
{
bool HasPermission(string permission);
}
public static class PermissionsExt
{
public static IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> WithPermissions<TLimit, TActivatorData, TRegistrationStyle>(this IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> registration)
{
registration.RegistrationData.ActivatingHandlers.Add((s, e) =>
{
var service = e.Context.Resolve<IPermissionService>();
foreach(var info in e.Instance.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => p.CanWrite))
{
var permissions = info.GetCustomAttributes(typeof(PermissionAttribute), true).Cast<PermissionAttribute>().Select(p => p.RequiredPermission).ToArray();
if(permissions.Any())
{
info.SetValue(e.Instance, permissions.Any(p => service.HasPermission(p)), null);
};
}
});
return registration;
}
}
class ClassA
{
[Permission("A")]
public bool CanA { get; set; }
[Permission("B")]
public bool CanB { get; set; }
public void Execute()
{
if(CanA)
Console.WriteLine("Doing A");
if(CanB)
Console.WriteLine("Doing B");
}
}
void Main()
{
var builder = new ContainerBuilder();
var permissionService = new PermissionService();
permissionService.Allow("A");
permissionService.Allow("B");
builder.RegisterInstance(permissionService).AsImplementedInterfaces().SingleInstance();
builder.RegisterType<ClassA>().AsSelf().WithPermissions();
using(var container = builder.Build())
{
var p = container.Resolve<IPermissionService>();
container.Resolve<ClassA>().Execute();
}
}
class PermissionService : IPermissionService
{
private IList<string> _permissions = new List<string>();
public void Allow(string permission)
{
_permissions.Add(permission);
}
public bool HasPermission(string permission)
{
return _permissions.Contains(permission);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment