2016-04-03 9 views
1

にオブジェクトの状態を初期化し、私は、データベースから、いくつかの現在のユーザーのアクセス許可のデータを取得する必要があり、その後、この情報は(複数のオブジェクトで構成されている)ロジック のIoC - すべてのページ要求のコンストラクタ

に数回使います

リクエストごとにデータベースからデータを取得し、必要に応じてそれを注入して再利用します。

これを行うには、次の方法がありますか?

1))この

class ApplicationUser : IApplicationUserProvider 
{ 
    private UserPermissions _userPermissions; 
    ... 

    public ApplicationUser(IDatabase userService) 
    { 
     _userPermissions = userService.GetUserPermission(); // this would executed for every request once 
    } 

    UserRoles GetRoles() 
    { 
     return _userPermissions; 
    } 
} 

2のようなオブジェクトを定義し、この

var container1 = new Container(c => 
      { 
     c.For<IDatabase>().Use<Database>(); 
     c.For<IApplicationUser>().Use<ApplicationUser >(); 
     c.For<IApplicationLogic1>().Use<ApplicationLogic1>(); // this has IApplicationUser in ctor 
     c.For<IApplicationLogic2>().Use<ApplicationLogic2>(); // this has IApplicationUser in ctor 
      }); 

3のようなIOC何かを定義する)制御器は

void PageController(IApplicationLogic1 l1) 
{ 
    l1.Process(); 
    l2.Process(); 
} 

答えて

1

UserPermissions情報であるであろうランタイムデータであり、hereのように、ランタイムデータはオブジェクトグラフの作成中に注入または解決されます。

代わりに、userService.GetUserPermission()の呼び出しをコンストラクタから移動する必要があります。あなたは、PerRequestCacheDatabaseDecorator内の実際のデータベースをラップすることにより

public class PerRequestCacheDatabaseDecorator : IDatabase 
{ 
    private IDatabase _decoratee; 

    public PerRequestCacheDatabaseDecorator(IDatabase decoratee) { 
     _decoratee = decoratee; 
    } 

    public UserPermissions GetUserPermission() { 
     var items = HttpContext.Current.Items; 
     if (items["permissions"] == null) 
      items["permissions"] = _decoratee.GetUserPermission(); 
     return (UserPermissions)items["permissions"]; 
    } 
} 

class ApplicationUser : IApplicationUserProvider 
{ 
    private Lazy<UserPermissions> _userPermissions; 

    public ApplicationUser(IDatabase userService) { 
     _userPermissions = new Lazy<UserPermissions>(userService.GetUserPermission); 
    } 

    UserRoles GetRoles() { 
     return _userPermissions.Value.GetRoles(); 
    } 
} 

別のオプションは、キャッシュを実装しますIDatabaseにデコレータを定義することです。たとえばLazy<T>を使用してコールを遅延させることにより

class ApplicationUser : IApplicationUserProvider 
{ 
    private IDatabase _userService; 

    public ApplicationUser(IDatabase userService) { 
     _userService = userService; 
    } 

    public UserRoles GetRoles() { 
     return _userService.GetUserPermission().GetRoles(); 
    } 
} 

どちら次へApplicationUserを簡素化することができますクラスもDatabaseクラスもこのパフォーマンスの最適化に関係しています。これは良いことです。デコレータを使用すると、既存のクラスを変更することなく、このパフォーマンスの最適化をプラグインすることができます。

関連する問題