RepositoryLocator, a variation of generic repository

I use StructureMap as IoC at work.

I use it to get an object I need, and it is very handy.

One night, while cycling home, I thought what if I can get repository in the same way I get object from StructureMap.

I know there is a pattern called “Generic Repository”, but this is slightly different. You have one generic repository class, and it locates an appropriate repository based on the type you want as return value. So, I call it Repository Locator.

So, look at the code and let me know if this is useful.

class Program
{
    static void Main(string[] args)
    {
       ObjectFactory.Initialize(x =>
                                    {
                                        x.For<IRepository<Company>>().Use<CompanyRepository>();
                                        x.For<IRepository<User>>().Use<UserRepository>();
                                    });

        var repository = ObjectFactory.GetInstance<GenericRepository>();
        var company = repository.Find<Company>(1);
        var user = repository.Find<User>(10);

        Console.WriteLine("Object: " + company.GetType() + ", " + company.Id);
        Console.WriteLine("Object: " + user.GetType() + ", " + user.Id);
    }
}

public class GenericRepository
{
    public T Find<T>(int id)
    {
        var actualRepository = ObjectFactory.GetInstance<IRepository<T>>();
        return actualRepository.Find(id);
    }
}

public class UserRepository : IRepository<User>
{
    public User Find(int id)
    {
        return new User { Id = id };
    }
}

public class CompanyRepository : IRepository<Company>
{
    public Company Find(int id)
    {
        return new Company { Id = id};
    }
}

public interface IRepository<T>
{
    T Find(int id);
}

public class User
{
    public int Id { get; set; }
}

public class Company
{
    public int Id { get; set; }
}
RepositoryLocator, a variation of generic repository

structuremap will scan your machine.config / web.config

It’s not a security threat or concern. I don’t mean StructureMap does any harm. As IoC container, StructureMap tries to do his job by searching for assemblies specified in your machine.config or web.config.

For example, it is a kind of legacy, but we specified our custom GAC assemblies in web.config in C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG

<compilation>
  <assemblies>
	<add assembly="mscorlib"/>
	<add assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
	...
	<add assembly="Your.Custom.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c77a5H561934e089"/>
	...

The problem is StructureMap can complain that it can’t load the type while it is trying to find the matching instance. For example, we have the assembly on our dev machine and integration server, but not on the build box, and suddenly our functional tests start failing. Our functional tests do not use those dlls at all, and still StructureMap fail.

So beware of those naughty custom GAC assemblies, if you have any and put them in web.config or machine.config.

structuremap will scan your machine.config / web.config