如何自动化Unity注册?

时间:2013-03-05 19:06:39

标签: c# unity-container repository-pattern abstract base

在我的代码中,我有很多这样的重复动作。 我想写一个通用方法(带反射)来自动化这个具有一个基类的对象的注册存储库过程

        _container.RegisterType(typeof(IFinanceRepository<User, int>), typeof(UsersRepository), new TransientLifetimeManager(), new InjectionMember[] { });
        _container.RegisterType(typeof(IFinanceRepository<News, int>), typeof(NewsRepository), new TransientLifetimeManager(), new InjectionMember[] { });
        _container.RegisterType(typeof(IFinanceRepository<Currency, int>), typeof(CurrenciesRepository), new TransientLifetimeManager(), new InjectionMember[] { });
        _container.RegisterType(typeof(IFinanceRepository<Language, int>), typeof(LanguagesRepository), new TransientLifetimeManager(), new InjectionMember[] { });

并且

public class UsersRepository : EFFinanceRepository<User, int>

所有对象(用户,新闻,e.t.c。都有基本接口 - IObject有T - 是ID属性的类型(Guid,int等)

 public class User : IObject<int>
{
    /// <summary>
    /// every object ID
    /// </summary>
    public int ID { get; set; }

所有存储库都有基类

IOvolimeFinanceRepository<T, in IDType>

T-IObject(用户,新闻) IDType - 每个对象i

的ID属性的类型

请帮助我,请使用全新的抽象通用方法自动执行此操作!

3 个答案:

答案 0 :(得分:1)

您可能希望使用添加基于约定的注册的Unity扩展。那里有几个。我没有使用它们中的任何一个,但是我已经使用了与温莎城堡的会议注册,我非常喜欢它。

答案 1 :(得分:0)

您需要为存储库主界面添加简单接口(IOvolimeFinanceRepository) - IGenericRepository

var types = Assembly.GetExecutingAssembly().GetTypes();

        var concreteRepositoryTypes = (from t in types
                                       where !t.IsAbstract && typeof(IGenericRepository).IsAssignableFrom(t)
                                       select t).ToList();

        foreach (var repositoryType in concreteRepositoryTypes)
        {
            //register like _container.RegisterType(typeof(UsersRepository), typeof(UsersRepository), new TransientLifetimeManager(), new InjectionMember[] { });
            _container.RegisterType(repositoryType, new TransientLifetimeManager(), new InjectionMember[] { });

            var interfaceForRepository = repositoryType.GetInterfaces().FirstOrDefault(x => x != typeof(IGenericRepository));

            if(interfaceForRepository != null)
                _container.RegisterType(interfaceForRepository, repositoryType, new TransientLifetimeManager(), new InjectionMember[] { });
        }
    }

答案 2 :(得分:0)

Unity已经按照惯例注册。

您没有提到您要定位的版本。我很确定这可以从Unity 3.0开始使用

http://msdn.microsoft.com/en-us/library/dn507479%28v=pandp.30%29.aspx