Jun 9, 2012
(1 votes)

Community Attribute Builder final

If you are working with Relate+ platform most probably you are using entities attributes to attach some additional info to particular entity type. This is a great way to extend built-in functionality but however involved a bit of manual work:

  1. You have to define attribute for each of the entity in Relate+ administrative UI (which honestly speaking could be made more user friendly).
  2. You have to refer to the attribute via stringly-typed interface.


Latter for me is most embarrassing.


instance.SetAttributeValue("attributeName", attributeValue);


This approach could give you few real scenarios where such is unacceptable:

  1. When you will margin for a grammar error when typing attribute name – that could be discovered only during runtime.
  2. You cannot use static code analysis tools. Like to search for all attribute usages.
  3. You cannot use some of the refactoring tools –> like rename attribute name.
  4. You can easily change type of the attribute and forget about code that uses that, effect –> runtime error(s).
  5. Use cannot leverage all the power of Visual Studio (for instance to provide Intellisense over available attributes)


So therefore I created package that should relief tasks with Community entity’s attributes – Community Attribute Builder.

There were already some posts on this topic here, here and there. Latest version (1.0) is out and this is just a summary of what’s supported.


1. Describe community entity’s attributes in code. Those attributes defined in metadata class are synced during application start-up and added to the target entity:


[CommunityEntity(TargetType = typeof(IUser))]
public class SampleAttributeMetadata
    public virtual IList<SampleType> SampleAttribute { get; set; }


2. Limit scanning of the assemblies:


    <section name="entityAttributeBuilder" type="Geta.Community.EntityAttributeBuilder.EntityAttributeBuilderConfiguration, Geta.Community.EntityAttributeBuilder" />

      <add assembly="EntityAttributes" />
      <remove assembly="RemoveAssembly" />


3. You can set or get entity’s attribute value(s) using strongly-typed interface.


var metadata = instance.AsAttributeExtendable<SampleAttributeMetadata>();
metadata.SampleAttribute = null;


4. Support for strongly typed queries


var query = new UserQuery();
var qmetadata = query.AsMetadataQuery<SampleAttributeMetadata>();
qmetadata[m => m.SampleAttribute] = new StringCriterion { Value = "the attribute value" };


5. Added support for IList<T> type attributes. You can assign via local variable assignment and modification or using line modifications.


var entity = instance.AsAttributeExtendable<SampleAttributeMetadata>();

// getter
var collection = entity.SampleAttribute;
collection.Add(new SampleType(100));
// setter
entity.SampleAttribute = collection;


or you can use more convenient syntax:


var entity = instance.AsAttributeExtendable<SampleAttributeMetadata>();
entity.SampleAttribute.Add(new SampleType(100));



Rename, deletion and content migration for the community entity attributes need to me done manually.

Can be found here (or search by “community” in NuGet package manager).


I somebody is really curious how to implement interfaces like these – strongly-typed interface over stringly-typed one, some basics could be found here.

Source could be found in GitHub.



Hope this helps!

Jun 09, 2012


Jun 13, 2012 12:41 PM

Very useful, nice work! Now we got PTB and CAB :)

Please login to comment.
Latest blogs
Optimizely SendGrid SMTP host is deprecated

SendGrid is a services for sending email that is included in Optimizely DXP. Previously was the recommended SMTP server to use,...

Tomas Hensrud Gulla | Dec 4, 2022 | Syndicated blog

Hosting Optimizely CMS 12 on Docker Engine

Since Optimizely CMS can now be deployed as a Docker container, here is a demonstration of building, running and scaling an Optimizely CMS 12 site ...

Stefan Holm Olsen | Dec 4, 2022 | Syndicated blog

How to use CacheTagHelper with content areas in Optimizely CMS 12

I might be going out on a limb here - if you have a better solution, feel very free to share it!  Upgrading your Optimizely web application from .N...

Andreas J | Dec 2, 2022

The 1001st Piece in your 1000 Piece Puzzle: .NET Default Interface Functions

I was recently working with a client who wanted a reasonably large subsystem added to Optimizely that would add automated management to their...

Greg J | Nov 28, 2022 | Syndicated blog