【发布时间】:2011-07-16 04:21:34
【问题描述】:
我们正在尝试使用 Linq2SQl 实现存储库模式,并且数据上下文是延迟初始化的。
Repository 类实现 IRepository
public class Repository<T> : IRepository<T> where T : class
{
private readonly Table<T> _table;
public Repository(IDataContextAdapter dataContextAdapter)
{
_table = dataContextAdapter.Context.GetTable<T>();
}
...
}
数据访问使用存储库的委托
public class UserDataAccess : IUserDataAccess
{
private readonly IRepository<User> _userRepository;
public UserDataAccess(IDataContextAdapter dataContextAdapter,
Func<IDataContextAdapter, IRepository<User>> userRepository)
{
_userRepository = userRepository(dataContextAdapter);
}
}
我想知道如何在统一容器中定义存储库。
目前我有以下内容,但我不想为每个具体的存储库类(如 User、Employer 等)重复它。
UnityContainer.RegisterType<Func<IDataContextAdapter, IRepository<User>>>(
new InjectionFactory(c =>
new Func<IDataContextAdapter, IRepository<User>>(
context => new Repository<User>(context))
)
);
我正在寻找一种通用定义类型的方法,例如
UnityContainer.RegisterType<Func<IDataContextAdapter, IRepository<T>>>(
new InjectionFactory(c =>
new Func<IDataContextAdapter, IRepository<T>>(
context => new Repository<T>(context))
)
);
我尝试过使用 on '' 应用 typeof 操作,但没有多大成功。
【问题讨论】:
-
您如何解决您的注册/依赖关系?能举个例子吗?
-
您还可以解释一下您想通过 a) Unity 和 b) 与代表实现什么目标?是否存在将 IDataContextAdapter 传递给 UserDataAccess 类但创建的存储库不是通过调用 new Repository
(_idatacontextadapter) 创建的情况,其中 _idatacontextadapter 是传递给 UserDataAccess 的 IDataContextAdapter? IE。你想通过委托建模什么样的变化? -
最后一个问题是,为什么每个表都需要一个存储库?这很不寻常,很少有用。
-
@zespri : DataContextAdapter 在运行时被调用,并且由于我自己的限制,在此之前无法初始化存储库和数据访问类,并且自动工厂旨在解决相同的问题。看看这个问题的背景,stackoverflow.com/questions/5171779/dependency-injection
-
好的,仍然不需要代表。我已经在下面更新了我的答案,请您回复建议的解决方案无法实现的您想要实现的目标。