私はaspコアアプリケーションで一般的なDIの使用法を持っています。aspコアのDIでパラメータを持つオブジェクトを初期化する
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped(typeof(IUnitOfWork), typeof(UnitOfWork));//DAL
services.AddScoped(typeof(IUpService), typeof(UpService));//BLL
...
}
コントローラDIによりUpServiceを得る:
public BaseController(IUpService upService)
{
_upService = upService;
}
ひいてはBLL(upservice)でインスタンスをUnitOfWorkの取得:ベースコントローラで
public UpService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
をiはプロパティあるCurrentUser
public User CurrentUser
{
get
{
User user = null;
var tokenCookie = HttpContext.Request.Headers.FirstOrDefault(c => c.Key == "token");
if (!string.IsNullOrEmpty(tokenCookie.Value) && tokenCookie.Value != "undefined")
{
user = _upService.GetUserById(new Guid(tokenCookie.Value));
}
return user;
}
}
を有します
W私が必要とする帽子は、CurrentUser
をBL層に(UpService
へ)渡すことです。 ASPコアのDIでそれを実現するには?
UPD: ここで私は現在のユーザーが必要なUpServiceの部分です。あなたは抽象化へCurrentUser
を抽出する必要があり
スティーブン、ご返信ありがとうございます。私は必要と思われる。しかし、実現後、「循環依存」が見つかった場合。実際に私はIUpServiceでIUserContextを尋ねます。結果として、IUserContextにはIUpServiceが必要ですが、IUpserviceにはIUserContextが必要です。そしてそれを解決する方法は? –
@VitalyMosin:あなたの質問を更新し、 'UpService'の実装を示してください。しかし、一般的に、循環参照はSingle Responsibility Principle違反によって引き起こされます。言い換えれば、 'UpService'はおそらく大きすぎ、分割する必要があります。 – Steven
私はRSPに違反する可能性があることに同意します。解決策は、userContextのサービスインジェクションをカットし、upserviceだけにトークンを渡すことです。その後、アップサービスコンストラクタでUserを取得し、_upService.CurrentUserプロパティでコントローラに返します。 –