1

我正在尝试构建一个工厂类,它将为我提供不同 DbContexts 的单例化实例。

主要思想是拥有一个Dictionary<Type,DbContext>可以容纳我需要的所有实例的GetDbContext(Type type)方法,以及一个在字典中查找类型并在它已经存在时返回它的方法。如果不是,它应该创建一个新的 Type(),并将其添加到相应的字典中。

我不知道该怎么做contexts.Add(type, new type());

public class DbContextFactory
{
    private readonly Dictionary<Type, DbContext> _contexts;
    private static DbContextFactory _instance;

    private DbContextFactory()
    {
        _contexts= new Dictionary<Type, DbContext>();
    }

    public static DbContextFactory GetFactory()
    {
        return _instance ?? (_instance = new DbContextFactory());
    }

    public DbContext GetDbContext(Type type)
    {
        if (type.BaseType != typeof(DbContext))
            throw new ArgumentException("Type is not a DbContext type");

        if (!_contexts.ContainsKey(type))
            _contexts.Add(type, new type()); //<--THIS is what I have now Idea how to do

        return _contexts[type];
    }
}
4

2 回答 2

3

使其成为通用方法:

public DbContext GetDbContext<T>() where T : new()
{
    if (typeof(T).BaseType != typeof(DbContext))
        throw new ArgumentException("Type is not a DbContext type");

    if (!_contexts.ContainsKey(type))
        _contexts.Add(typeof(T), new T());

    return _contexts[type];
}
于 2013-10-24T02:38:42.883 回答
2

您可以使用Activator创建 C# 类。一种方法是.CreateInstance(Type type)

MyClassBase myClass = Activator.CreateInstance(typeof(MyClass)) as MyClass;

但是对于 DbContext,您很可能希望传入连接字符串,因此请使用.CreateInstance(Type type, params Object[] args)

DbContext myContext = Activator.CreateInstance(typeof(MyClass),
  "ConnectionString") as DbContext;

或作为通用方法:

if (!_contexts.ContainsKey(typeof(T)))
  _contexts.Add(typeof(T),
    (T)Activator.CreateInstance(typeof(T), "ConnectionString");
于 2013-10-24T02:38:45.780 回答