我正在使用Unity作为其DI容器的模块化应用程序。在启动期间,应用程序会将扩展名(称为MyUnityExtension)添加到统一容器中。
现在,我希望向应用程序添加一个新模块,该模块使用自己的统一容器(我假设的父项的子项),并且该子容器没有定义扩展名。
如果我创建父容器的子容器,子容器是否也会继承MyUnityExtension?我搜索并发现了一些旧的信息,表明它不会,但想确定。
Unity有一个功能,即使没有注册类,您也可以请求依赖于这些类的具体类型的实例,Unity将找出如何创建它们并为您提供实例(找到该信息) here)。在我的新模块中,我希望Unity在执行任何解析时仅检查我之前创建的子容器,而不考虑父容器。我无法看到一种方法来挂钩这个过程,因为Unity自己正在进行解析(因为该类尚未注册),并且我不知道当子容器存在时如何更改进程。
我是团结的新手所以不确定这是否可能。
答案 0 :(得分:0)
好的,首先here是一个非常好的Unity教程。
然后
创建子容器时AFAIK这是确切的行为,但如果您想确定在IUnityContainer中定义了一个名为RemoveAllExtensions的方法。此方法也会删除所有默认扩展名。因此,您必须使用扩展程序配置容器,也可以使用您想要的默认容器
这也是你的第二点。使用Extensions,您基本上可以将任何逻辑插入UnitContainer生命周期,例如。处理不同的解决等
如果您想了解有关扩展的更多信息,请访问以下链接:
希望能让你走上正轨;)
答案 1 :(得分:0)
这取决于您使用的对象生命周期,假设如果您使用的是heirarchicallifetimemanager,则子容器将使用相同的对象,而不是创建新的对象,就像使用ContainerControlledLifetimeManager那样,则该对象之间不会共享父母和孩子。
答案 2 :(得分:0)
public class BandT1sSequence implements UiThreadCallback {
private final static String TAG = BandT1sSequence.class.getSimpleName();
private static final String ACTION_GATT_CONNECTED =
"com.world.bluetooth.le.ACTION_GATT_CONNECTED";
private static final String ACTION_GATT_DISCONNECTED =
"com.world.bluetooth.le.ACTION_GATT_DISCONNECTED";
private static final String ACTION_GATT_SERVICES_DISCOVERED =
"com.world.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
private static final String ACTION_DATA_AVAILABLE =
"com.world.bluetooth.le.ACTION_DATA_AVAILABLE";
private static final String EXTRA_DATA =
"com.world.bluetooth.le.EXTRA_DATA";
private static final String CLASS_CONSTRUCTED =
"com.world.bluetooth.le.CLASS_CONSTRUCTED";
private LocationManager locationManager;
private String mExtraFilter;
private Boolean closeCompletedFlag = false;
private Boolean clearQueuesFlag = false;
/Constructor
public BandT1sSequence(Context context){
if (context!=null && mContext ==null)
mContext = context;
Log.d(TAG, "BandT1sSequence constructor");
//AE - Malaysia
mCommandManager = CommandManager.getInstance(mContext);
locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
intThread();
mExtraFilter = Integer.toString(System.identityHashCode(mHandlerThread));
//System.identityHashCode(mBluetoothLeClass)
//Create bluetooth class
mBluetoothLeClass = new BluetoothBle(context,mExtraFilter);
//confirm the object identity
dataHelper = DataHelper.getsInstance(context);
//Register broadcast receivers
if (mBluetoothLeClass != null)
mContext.registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
}
private IntentFilter makeGattUpdateIntentFilter() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_GATT_CONNECTED);
intentFilter.addAction(ACTION_GATT_DISCONNECTED);
intentFilter.addAction(ACTION_GATT_SERVICES_DISCOVERED);
intentFilter.addAction(ACTION_DATA_AVAILABLE);
intentFilter.addAction(CLASS_CONSTRUCTED);
return intentFilter;
}
public void connectToDevice (){
if (mBluetoothLeClassConstructed && mBluetoothLeClass!=null && bandConnectionFlag==false ) {
mDeviceConnectedFlag= mBluetoothLeClass.connect(mDeviceAddress);
int obj_id = System.identityHashCode(mBluetoothLeClass);
Log.d(TAG, "BandT1sSequence connect to device mBluetoothLeClass_obj_id:" + obj_id +" - "+ getBandDetails());
//device1ConnectionStarted=true;
}else
Log.d(TAG, "connectToDevice: can't connect " + mBluetoothLeClassConstructed);
}
private BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
bluetoothIntentAction = intent.getAction();
if (ACTION_GATT_CONNECTED.equals(bluetoothIntentAction)) {
if (!mSequence.settingModeFlag){
sendRunnableToHandlerThread(syncRunnable);
}
Log.d(TAG, "onConnectionStateChange: threads count " + java.lang.Thread.activeCount() +" - current thread " + Thread.currentThread().getId());
Log.d(TAG, "onReceive: BluetoothLeService.ACTION_GATT_CONNECTED");
} else if (ACTION_GATT_DISCONNECTED.equals(bluetoothIntentAction)) {
Log.d(TAG, "onReceive: BluetoothLeService.ACTION_GATT_DISCONNECTED B: " + mDeviceName +"-"+mDeviceAddress );
mBluetoothLeClass.close();
bandConnectionFlag = false;
} else if (ACTION_GATT_SERVICES_DISCOVERED.equals(bluetoothIntentAction)) {
}
}
};
}