0

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

        _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>

所有对象(用户、新闻等都有基本接口 - 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 (User, News) IDType - 每个对象 i 的 ID 属性类型

帮助我,请生成完整的抽象通用方法来自动化这个!

4

3 回答 3

1

您可能想考虑使用添加基于约定的注册的 Unity 扩展。那里有几个。我没有使用过它们中的任何一个,但我使用了基于惯例的温莎城堡注册,我非常喜欢它。

于 2013-03-06T16:43:00.907 回答
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[] { });
        }
    }
于 2013-03-06T16:24:43.323 回答
0

Unity 已经带有按惯例注册。

你没有提到你的目标是哪个版本。我很确定这从 Unity 3.0 开始可用

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

于 2014-12-30T05:51:05.610 回答