views:

95

answers:

2

I have a a WPF prism desktop app with a few modules. In the past I've put all my localized resources in common resource files in the infrastructure assembly and referenced it in all modules.

But lately I have been wondering if that is indeed the right approach from a maintainence perspective. In essence it also sort of breaks modularity. Would having module specific resource files in the the modules themselves be a better approach in the long run?

All thoughts appreciated.

A: 

I never have references between the individual modules when using Prism (unless one module is indeed an enhancement of another). I tend to put shared resources, interfaces etc. in a 'common'-assembly that is referenced by all modules and the assembly containing the shell. Things that implement an interface is then retrieved via the IoC-container and the implementation is placed in the module where it 'belongs'.

As you write - having them in the infrastructure module breaks one of the ideas behind Prism.

Goblin
Well, you also have them in the infrastructure module just that you name it not that way. What else is your assembly that holds your resources than an infrastructure assembly.
PVitt
@Goblin as PVitt says, you have the same setup as mine. Your "common" assembly is my "Infrastructure" assembly.
NVM
No - my infrastructure is a module in itself. The 'common' assembly is separate from that.
Goblin
Just to clarify - to me infrastructure is about where/how do I get/send data to and from the application. Resoources such as localizable strings, icons, styles in resource dictionaries is not part of the infrastructure.
Goblin
Well then each of your module has a dependency on two other dll's in your project (lets drop the technical terms) instead of the one that I have. I think in essence it breaks modularity even further then it does in my case
NVM
Yes - you are right - my modules (whatever they contain) depend on an assembly with the Business rules and one with common functionality (base-classes, interfaces, resources etc.) You may have better encapsulation - I may have more opportunities to uphold Do not Repeat Yourself (DRY) - it's a matter of trade-offs.
Goblin
Just for the sake of discussion, if I understand it right, the way you have things setup you are only trying to achieve UI modularity and not generic modularity. If you have all your business rules in one module you've coupled everything together even though you have multiple projects giving the appearance of modularity.
NVM
Correct. I need to solve: "Customer A can see module 1 and 2", "Customer B can see module 2, but not 1" scenarios. The domain is cohesive and shared between the modules.
Goblin
+1  A: 

As far as one of Prism's main targets is modularity it just seems obvious to put your resources only in the appropriate assembly. Sharing resources via one centralized assembly is the opposite of modularity. Doing it the centralized way will get you another type of DLL hell at the time you want to add more (optional) modules. You will have to update the common assembly without the knowledge of the modules that use the assembly. And determining which module is present just again violates the modularity itself. The other way is to always update the common assembly to the latest version. Whatever you do, following the centralized approach forces you to build all your modules backward-compatible.

This is my point of view at the moment. But as far as I'm working with Prism for only a few weeks now I'm not quite sure if my statement is the way how it should be done.

PVitt
Thanks PVitt. That does answer my question!! Cheers
NVM