构造函数注入 - 将两个单独的配置依赖项绑定到存储库类中

时间:2016-07-24 17:25:51

标签: c# dependency-injection ninject

在DI之后,创建两个单独的存储库类的最佳实践是什么......例如。

public class FirstDbRepo : Repository

public class SecondDbRepo : Repository

基本上实现了下面显示的Repository类

namespace MyApp.Persistence
{
    public class Repository<T> : IRepository<T> where T : EntityBase
    {
        public IConfig Config { get; set; }
        private Database Database 
        { 
            get 
            {
                 // Use Config to get connection
            }; 
            set; 
        }

        public Repository(IConfig config)
        {
            Config = config;
        }

        public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
        {
            // Use database to get items
        }

        public T CreateItem(T item)
        {
            // Use database to create item
        }
    }
}

但要注入不同的配置值/实例......

public interface IConfig
{
    string DatabaseName{ get; }
    string DatabaseEndpoint{ get; }
    string DatabaseAuthKey{ get; }
}

我想到的第一件事就是创建标记界面,但是想知道这是否有气味......是否有更正确的方法来使用DI?

public interface IFirstDbRepo { }

public class FirstDbRepo<T> : Repository<T> where T: EntityBase
{
    public FirstDbRepo(FirstConfig config)
        : base(config)
    { }
}

public class FirstConfig : IConfig
{
    public string DatabaseName{ get { return "MyName" }; } // From web.config
}

然后为每个repo使用ninject绑定...消费者可以使用如下

public class Consumer() {
     private readonly IFirstDbRepo _firstRepo;
     public Consumer(IFirstDbRepo firstRepo) {
         _firstRepo = firstRepo;
     }
}

1 个答案:

答案 0 :(得分:1)

Bind<IConfig>().To<MyConfigOne>().WhenInjectedInto(typeof(FirstDbRepo));
Bind<IConfig>().To<MyConfigTwo>().WhenInjectedInto(typeof(SecondDbRepo ));

Contextual binding