1

さまざまな DbContext のシングルトン化されたインスタンスを提供するファクトリ クラスを構築しようとしています。

主なアイデアは、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# クラスを作成できます。1 つのメソッドは.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 に答える