Unity子容器和扩展

时间:2014-03-28 21:01:44

标签: c# unity-container

我正在使用Unity作为其DI容器的模块化应用程序。在启动期间,应用程序会将扩展名(称为MyUnityExtension)添加到统一容器中。

现在,我希望向应用程序添加一个新模块,该模块使用自己的统一容器(我假设的父项的子项),并且该子容器没有定义扩展名。

  1. 如果我创建父容器的子容器,子容器是否也会继承MyUnityExtension?我搜索并发现了一些旧的信息,表明它不会,但想确定。

  2. Unity有一个功能,即使没有注册类,您也可以请求依赖于这些类的具体类型的实例,Unity将找出如何创建它们并为您提供实例(找到该信息) here)。在我的新模块中,我希望Unity在执行任何解析时仅检查我之前创建的子容器,而不考虑父容器。我无法看到一种方法来挂钩这个过程,因为Unity自己正在进行解析(因为该类尚未注册),并且我不知道当子容器存在时如何更改进程。

  3. 我是团结的新手所以不确定这是否可能。

3 个答案:

答案 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)) {
              
            }
        }
    };

}