c# - RegisterType with EventAggregator and ViewModel -
i not understand how register ieventaggregator
instance can inject viewmodel
.
example:
i define mainviewmodel
:
... private ieventaggregator _eventaggregator; public mainviewmodel(ieventaggregator eventaggregator) { _eventaggregator = eventaggregator; ... } ...
then, need somehow register class implements ieventaggregator
want inject in viewmodel
.
in moduleinit
class, have this:
... private iunitycontainer _container; public moduleinit(iunitycontainer _container) { _container = container; } ... public void initialize() { container.registertype<ieventaggregator, ___(something)___>(); ... }
in mainviewmodel
class, can implement _eventaggregator = servicelocator,current.getinstance<ieventaggregator>();
, don't understand conceptually i'm doing. program works...
i understand servicelocator
doing, , should doing appropriately register type container. don't define class implements ieventaggregator
, servicelocator
getting instance? , have register when resolve something, viewmodel
, create new eventaggregator
instance?
eventaggregator:
the prism library has default eventaggregator
can use. located in microsoft.practices.prism.events
if use prism < 5.0 or in microsoft.practices.prism.pubsubevents
if use prism >= 5.0
also, if use unitybootstrapper
fromunityextensions
, suspect since using modules, build in services (including eventaggregator
) in prism registered you:
class mybootstrapper : unitybootstrapper { protected override void configurecontainer() { // base.configurecontainer setup build in prism services base.configurecontainer(); //register own stuff } }
servicelocator:
the servicelocator
static wrapper, contacts current instance of iunitycontainer
resolve. should never use servicelocator
fetch resolves, unless there no possible way to otherwise (e.g. in static constructor). pattern called the service locator pattern, , not appreciated.
unitycontainer:
the container's job create instances of whatever class registered specific interface, monitor lifetime, , reuse instances if specified. when register:
container.registertype<ieventaggregator, eventaggregator>();
...you instruct container return instance of eventaggregator
, when class constructor has parameter of type ieventaggregator
.
however if wish single instance of registered class, need specify lifetime manager: containercontrolledlifetimemanager
, so:
... , eventaggreagator>(new containercontrolledlifetimemanager());
this instructs container reuse same instance every time is requested. default lifetime manager when using registertype
transientlifetimemanager
instruct container create new instance every time.
note: if use registerinstance
@ point, note default lifetimemanager containercontrolledlifetimemanager
, not transient.
further reading:
i suggest read on dependency injection , inversion of control, trying do. maybe tutorial of how prism works.
cheers