4

これは、Global.asax での StructureMap の現在の実装です。

var container = (IContainer)IOCContainer.Initialize();
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));

以下は、上記で参照されているコードです。

public static class IOCContainer
    {
        public static IContainer Initialize()
        {
            ObjectFactory.Initialize(x =>
            {
                x.Scan(scan =>
                {
                    scan.TheCallingAssembly();
                    scan.WithDefaultConventions();
                    scan.AddAllTypesOf<IController>();
                });

                x.For<IConfigRepository>().Use<ConfigRepository>();
            });
            return ObjectFactory.Container;
        }

    }

public class StructureMapDependencyResolver : IDependencyResolver
    {
        public StructureMapDependencyResolver(IContainer container)
        {
            _container = container;
        }

        public object GetService(Type serviceType)
        {
            if (serviceType.IsAbstract || serviceType.IsInterface)
            {
                return _container.TryGetInstance(serviceType);
            }
            else
            {
                return _container.GetInstance(serviceType);
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return _container.GetAllInstances<object>()
                .Where(s => s.GetType() == serviceType);
        }

        private readonly IContainer _container;
    }

共有接続を使用するとパフォーマンスが少し向上する可能性があることを読んだので、MVC アプリでこれを使用する方法を考えていました。新しく作成した PetaPoco.Database オブジェクトをリポジトリのコンストラクタに渡す必要があると思いますか??

ありがとう

4

3 に答える 3

3

私のプロジェクトで使用しているのは Autofac のことだけです。これはあなたがやろうとしていることには当てはまらないかもしれませんが、共有したほうがよいでしょう。http 要求ごとに petapoco データベース オブジェクトを取得するために、global.asax.cs にこの構成があります。

builder.RegisterType<MyProject.ObjectRelationalMapper.PetaPoco.Database>()
                .As<MyProject.ObjectRelationalMapper.PetaPoco.Database>()
                .WithParameters( new List<NamedParameter>() {new NamedParameter( "connectionStringName", "MyProjectConnectionString")})
                .InstancePerHttpRequest();

MyProject.ObjectRelationalMapper.PetaPoco は、名前を変更した petapoco.cs です。

Autofac では、WithParameters() を介して渡すパラメーターを指定することで、呼び出すコンストラクターのバージョンを指定できます。オブジェクトを構築するときに、一致するパラメーターを持つコンストラクターを見つけます。

コンストラクターに依存関係が注入されるたびに、http 要求全体で同じ petapoco データベース オブジェクトが使用されます。

私のコントローラーコンストラクターは、 INextMatchService を依存関係として受け取り、次に INextMatchRepository を依存関係として受け取ります。

public NextMatchRepository( Database database, ISessionWrapper sessionWrapper)
{
    this._database = database;
    this._sessionWrapper = sessionWrapper;
}

「データベース」タイプは MyProject.ObjectRelationalMapper.PetaPoco.Database で、上記のコード スニペットで構築されます。これで、リポジトリが共有データベース接続で機能するようになりました。Petapoco 関数を操作すると、使用する接続が既に存在するかどうかがチェックされ、存在する場合はカウンターがインクリメントされ、オブジェクトが使用されます。

// Open a connection (can be nested)
public void OpenSharedConnection()
{
    if (_sharedConnectionDepth == 0)
    {
        _sharedConnection = _factory.CreateConnection();
        _sharedConnection.ConnectionString = _connectionString;
        _sharedConnection.Open();

        if (KeepConnectionAlive)
            _sharedConnectionDepth++;// Make sure you call Dispose
    }
    _sharedConnectionDepth++;
}
于 2011-09-15T19:50:35.223 に答える
2

誰かが知りたい場合は、これを使用しました:

x.For<PetaPoco.Database>().Singleton().Use(() => new PetaPoco.Database("DBConnection"));
于 2011-09-22T13:01:27.407 に答える
0

PetaPoco で取得した T4 を実行すると、次のものが利用可能になります。

{yourmodel}.ConnectionStringDB.GetInstance();

これはインスタンスを探します。インスタンスがある場合はそれを使用し、そうでない場合は別のインスタンスを作成します。

私はそれについて間違っている可能性があります.. 私は完全に思い出せません.

于 2011-09-15T13:25:52.160 に答える