Some few aspects that you can use with NetAspect
The aspect code
public class LogAttribute : Attribute
{
public interface ILogger
{
void Info(string text);
void Error(string text);
}
public static ILogger Logger;
public bool NetAspectAttribute = true;
private static string ComputeLog(string eventName, MethodInfo method)
{
return string.Format("{0} {1} ", eventName, method.Name);
}
public void BeforeMethod(MethodInfo method)
{
Logger.Info(ComputeLog("On enter :", method));
}
public void AfterMethod(MethodInfo method)
{
Logger.Info(ComputeLog("On exit :", method));
}
public void OnExceptionMethod(MethodInfo method, Exception exception)
{
Logger.Error(ComputeLog(exception.Message, method));
}
}
A sample class
public class ClassToWeave
{
[Log]
public int Divide(int value, int divideBy)
{
return value / divideBy;
}
}
The following code is working
{
var defaultLogger = new DefaultLogger();
LogAttribute.Logger = defaultLogger;
var classToWeave = new ClassToWeave();
classToWeave.Divide(12, 3);
Assert.AreEqual(2, defaultLogger.infos.Count);
Assert.AreEqual(0, defaultLogger.errors.Count);
try
{
classToWeave.Divide(12, 0);
}
catch (Exception)
{
}
Assert.AreEqual(3, defaultLogger.infos.Count);
Assert.AreEqual(1, defaultLogger.errors.Count);
}
The aspect code
public class TransactionalAttribute : Attribute
{
private static NHibernate.ISession session;
public bool NetAspectAttribute = true;
private NHibernate.ITransaction transaction;
public static void SetSession(NHibernate.ISession newSession)
{
session = newSession;
}
public void AfterMethod()
{
transaction.Commit();
}
public void BeforeMethod()
{
transaction = session.BeginTransaction();
}
public void OnExceptionMethod()
{
transaction.Rollback();
}
}
A sample class
public class ClassToWeave
{
[Transactional]
public int Divide(int value, int divideBy)
{
return value / divideBy;
}
}
The following code is working
{
TransactionalAttribute.SetSession(new FakeSession());
var classToWeave = new ClassToWeave();
classToWeave.Divide(12, 3);
Assert.True(FakeTransation.IsCommited);
Assert.False(FakeTransation.IsRollback);
}
The aspect code
public class GreaterThanOrEqualToAttribute : Attribute
{
private readonly int _value;
public bool NetAspectAttribute = true;
public GreaterThanOrEqualToAttribute(int value)
{
_value = value;
}
public void BeforeMethodForParameter(ParameterInfo parameter, int parameterValue)
{
BeforeMethodForParameter(parameter, (long)parameterValue);
}
public void BeforeMethodForParameter(ParameterInfo parameter, long parameterValue)
{
if (parameterValue < _value)
throw new Exception(string.Format("{0} must be greater than or equal to {1}", parameter.Name, _value));
}
}
A sample class
public class ClassToWeave
{
public void Check([GreaterThanOrEqualTo(10)] int param)
{
}
}
The following code is working
{
var classToWeave_L = new ClassToWeave();
classToWeave_L.Check(10);
try
{
classToWeave_L.Check(9);
Assert.Fail("Must fail");
}
catch (Exception e)
{
}
classToWeave_L.Check(11);
}
The aspect code
public class GreaterThanAttribute : Attribute
{
private readonly int _value;
public bool NetAspectAttribute = true;
public GreaterThanAttribute(int value)
{
_value = value;
}
public void BeforeMethodForParameter(ParameterInfo parameter, int parameterValue)
{
BeforeMethodForParameter(parameter, (long)parameterValue);
}
public void BeforeMethodForParameter(ParameterInfo parameter, long parameterValue)
{
if (parameterValue <= _value)
throw new Exception(string.Format("{0} must be greater than {1}", parameter.Name, _value));
}
}
A sample class
public class ClassToWeave
{
public void Check([GreaterThan(10)] int param)
{
}
public void CheckLong([GreaterThan(10)] long param)
{
}
}
The following code is working
{
var classToWeave_L = new ClassToWeave();
try
{
classToWeave_L.Check(10);
Assert.Fail("Must fail");
}
catch (Exception e)
{
}
try
{
classToWeave_L.Check(9);
Assert.Fail("Must fail");
}
catch (Exception e)
{
}
try
{
classToWeave_L.CheckLong(9);
Assert.Fail("Must fail");
}
catch (Exception e)
{
}
classToWeave_L.Check(11);
classToWeave_L.CheckLong(11);
}
The aspect code
public class LowerThanAttribute : Attribute
{
private readonly int _value;
public bool NetAspectAttribute = true;
public LowerThanAttribute(int value)
{
_value = value;
}
public void BeforeMethodForParameter(ParameterInfo parameter, int parameterValue)
{
BeforeMethodForParameter(parameter, (long)parameterValue);
}
public void BeforeMethodForParameter(ParameterInfo parameter, long parameterValue)
{
if (parameterValue >= _value)
throw new Exception(string.Format("{0} must be lower than {1}", parameter.Name, _value));
}
}
A sample class
public class ClassToWeave
{
public void Check([LowerThan(10)] int param)
{
}
}
The following code is working
{
var classToWeave_L = new ClassToWeave();
try
{
classToWeave_L.Check(10);
Assert.Fail("Must fail");
}
catch (Exception e)
{
}
try
{
classToWeave_L.Check(11);
Assert.Fail("Must fail");
}
catch (Exception e)
{
}
classToWeave_L.Check(9);
}
The aspect code
public class NotNullOrEmptyAttribute : Attribute
{
public bool NetAspectAttribute = true;
public void BeforeMethodForParameter(ParameterInfo parameter, string parameterValue)
{
if (string.IsNullOrEmpty(parameterValue))
throw new ArgumentNullException(parameter.Name);
}
}
A sample class
public class ClassToWeave
{
public void Check([NotNullOrEmpty] string param)
{
}
}
The following code is working
{
var classToWeave_L = new ClassToWeave();
try
{
classToWeave_L.Check(null);
Assert.Fail("Must fail");
}
catch (ArgumentNullException e)
{
Assert.AreEqual("param", e.ParamName);
}
try
{
classToWeave_L.Check("");
Assert.Fail("Must fail");
}
catch (ArgumentNullException e)
{
Assert.AreEqual("param", e.ParamName);
}
classToWeave_L.Check("not empty");
}
The aspect code
public class NotNullAttribute : Attribute
{
public bool NetAspectAttribute = true;
public void BeforeMethodForParameter(ParameterInfo parameter, object parameterValue)
{
if (parameterValue == null)
throw new ArgumentNullException(parameter.Name);
}
}
A sample class
public class ClassToWeave
{
public void Check([NotNull] string param)
{
}
}
The following code is working
{
var classToWeave_L = new ClassToWeave();
try
{
classToWeave_L.Check(null);
Assert.Fail("Must fail");
}
catch (ArgumentNullException e)
{
Assert.AreEqual("param", e.ParamName);
}
classToWeave_L.Check("");
}
The aspect code
public class TrimAttribute : Attribute
{
public bool NetAspectAttribute = true;
public void BeforeMethodForParameter(ref string parameterValue)
{
if (string.IsNullOrEmpty(parameterValue))
return;
parameterValue = parameterValue.Trim();
}
}
A sample class
public class ClassToWeave
{
public string TrimWithNetAspect([Trim] string param)
{
return param;
}
}
The following code is working
{
var classToWeave_L = new ClassToWeave();
Assert.AreEqual("ToTrim", classToWeave_L.TrimWithNetAspect("ToTrim "));
}