簡體   English   中英

使用Unity設置依賴注入以將類的實例傳遞給構造函數

[英]Setting up Dependency Injection using Unity to pass instance of class into a constructor

我肯定這里有我的問題的答案,盡管我只是不太了解我在尋找什么或我在閱讀什么……而且,不是100%地確定DI是我應該在其中使用的東西這個案例。

我正在嘗試將Unity用於我的DI。 我正在將依賴項注入ASP.Net Web API控制器。 到目前為止,一切都很好。

我正在將服務注入到控制器所需的控制器中。 例如,在我的一個控制器中,我有:

private TransactionService _transactionService;

public TransactionsController(TransactionService transactionService)
{
    _transactionService = transactionService;
}

在這種情況下,我將TransactionService實例注入控制器。 一切正常。

我的WebApiConfig.cs包含以下內容,據我了解,它實際執行注入:

   var container = new UnityContainer();
   container.RegisterType<ServiceBase>(new HierarchicalLifetimeManager());
   config.DependencyResolver = new UnityResolver(container);

如果需要,我可以向您展示我的UnityResolver

現在我正在努力的部分...

我的所有服務都繼承自Abstract類ServiceBase最簡單的形式是:

public abstract class ServiceBase : IDisposable
{

    internal Account _account;

    public ServiceBase(){}
} 

我想做的是在注入過程中創建Account ,並以某種方式傳遞它,以便注入的服務無需處理實例化帳戶。

在嘗試將任何構造函數添加到服務中以接受帳戶的那一刻,我收到消息以確保控制器具有無參數的構造函數。

所以..我如何設置我的DI,以便可以將服務注入控制器中,還可以將預先實例化的Account實例注入服務中?

更新

我忘了提(對不起,維克多)-如果可能,我不想使用屬性。 在我看來,我們可以使用DI解除依賴關系,然后到處放置一堆依賴屬性,這似乎很奇怪。 我很可能只是不正確地理解DI概念,盡管這對我來說似乎不合適

這應該很簡單,只需將其他屬性公開並在其上添加依賴項屬性即可。

 [Dependency]  
 public Account _account { get; set; }

Unity應該能夠注入屬性,您甚至可以以普通方式注冊Account類(例如,通過注入工廠)。

我希望這會給您一些想法。

創建服務基礎的接口,並將“帳戶”聲明為公共屬性。

服務接口:

you can also inherit other interfaces.
public interface ITransactionService : IDisposable
{
  IAccount Account{get;set;}
}

在您的班上實現它:

public class TransactionService : ITransactionService{
 private IAccount _account;
 public IAccount Account
 {
   get
     {if(_account==null)_account=new Account(); return _account;}
   set
     {_account=value;}
 }
}

現在,在API控制器上使用構造函數,如下所示:

private ITransactionService _transactionService;

public TransactionsController(ITransactionService transactionService)
{
    _transactionService = transactionService;
}

Unity解析器:

var container = new UnityContainer();
   container.RegisterType<ITransactionService,TransactionService>(new HierarchicalLifetimeManager());
   config.DependencyResolver = new UnityResolver(container);

因此,以這種方式使用屬性注入和構造函數注入來減少緊密耦合的依賴關系。

模擬用於單元測試的接口將非常容易。

您還可以為Account類創建一個接口,以便可以根據您的使用輕松進行模擬。

如果您不想使用我完全同意的屬性,最好的方法是讓ServiceBase接受account參數,例如:

public abstract class ServiceBase {
  private Account _account;

  public ServiceBase(Account account) {
    this._account = account;
  }
}

您將必須在派生服務以及TransactionService上聲明相同的構造函數。 實例化控制器后,Unity將首先正確創建Account類的實例,然后通過構造函數注入將其傳遞給您的TransactionService對象。 並且,您應該使用生命周期管理器注冊Account對象,以將其范圍限制為單例。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM