Dagger 2和其他依賴注入框架可幫助您編寫單個責任類,通過爲您管理構造函數來更輕鬆地進行測試。這是他們的主要優勢。
在該問題的具體代碼中(對於RecyclerView.Adapter
),使用Dagger 2或依賴注入不會獲得額外的利潤,並且可以繼續使用new
關鍵字和靜態工廠來擴充視圖:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
換句話說,你將不會被實時交換的依賴關係爲嘲笑所以在使用匕首2在這裏沒有一點測試ViewHolder
。
如果你想增加可讀性,你可以考慮使用數據綁定,你會用這樣的事情結束了:
return new ViewHolder(ListItemBinding.inflate(LayoutInflater.from(parent.getContext())));
另外,如果你有一個非常複雜的邏輯用於生產ViewHolder
你可以注入RecyclerView.Adapter
納入您的活動。然後,你可以注入ViewHolderFactory
您轉接器內,並用它來創建視圖:
private final Context context;
private final ViewHolderFactory viewHolderFactory;
@Inject
MyAdapter(Context context, ViewHolderFactory viewHolderFactory) {
this.context = context;
this.viewHolderFactory = viewHolderFactory;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int pos) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return ViewHolderFactory.create(view);
}
然後,它將有可能輕鬆測試對ViewHolderFactory
而不是反對重量級適配器。
這確實只是一個意見問題。我個人不會使用Dagger進行視圖創建和通貨膨脹,但只能用於'業務邏輯'的東西 –
同意@DavidMedenjak。我更喜歡注入Activities/Fragments的方法,然後從那裏手動構建對象圖。 (即傳遞適配器構造函數中的東西,並從那裏傳遞給ViewHolders)。話雖如此,如果你想注入它,可能最簡單的方法是在你的組件中創建和注入(ViewHolder)方法,並且使用@Inject註解來包裝私有字段。 – theFunkyEngineer