August 23, 2012
On Wednesday, 22 August 2012 at 16:57:26 UTC, Paulo Pinto wrote:
> On Wednesday, 22 August 2012 at 15:51:05 UTC, Philip Daniels wrote:
>>>snip<
>>
>> If we had dynamic loading, would we be able to do dependency
>> injection in D?
>
> Dependency injection does not require dynamic loading per se.
>
> It is all about using interfaces instead of classes, and initializing the corresponding instance members.
>
> You just need some piece of code that takes the responsibility of locating such interfaces, by registering the classes somehow, or by compile time reflection, which gets called on program initialization.
>
> You can do this in D today.
>
> --
> Paulo

But wouldn't that require you to link everything together at, err, compile time?

What I'm getting at is, would it be possible to port a DI/IoC tool such as StructureMap (http://docs.structuremap.net/index.html) or Spring to D? This can handle tasks such as creating dynamic plug-in architectures. For example, given SomeBigApp.exe (not written by me) which looks in standard folders for components implementing a particular interface, I can just drop my code in that folder and have it loaded at runtime. I could even drop it in there after the program starts running. I know how to achieve this in the .Net world, just wondered if it was possible in D.

August 24, 2012
On 2012-08-24 00:26, Philip Daniels wrote:

> But wouldn't that require you to link everything together at, err,
> compile time?
>
> What I'm getting at is, would it be possible to port a DI/IoC tool such
> as StructureMap (http://docs.structuremap.net/index.html) or Spring to
> D? This can handle tasks such as creating dynamic plug-in architectures.
> For example, given SomeBigApp.exe (not written by me) which looks in
> standard folders for components implementing a particular interface, I
> can just drop my code in that folder and have it loaded at runtime. I
> could even drop it in there after the program starts running. I know how
> to achieve this in the .Net world, just wondered if it was possible in D.

Sure, you just need to come up with a couple of conventions. Say for example that you have your application in a folder structure like this:

app
 |--plugins
     |---fully.qualified.class.name.so/dll/dylib

The host application inspects the "plugins" folder at runtime grabbing all the names of the dynamic libraries. The convention is that in the dynamic library there will be a class with the same fully qualified name as the name of the dynamic library its located in.

The next convention is that the class must implement an interface, which the host application provides. The class also needs to have a default constructor (there are ways around that).

Then the host application would do something like this:

interface Plugin
{
    void initialize ();
    // ... other needed methods
}

auto plugin = cast(Plugin) Object.factory("fully.qualified.class.name");
plugin.initialize();

The magic behind this is the "Object.factory" method:

http://dlang.org/phobos/object.html#factory

-- 
/Jacob Carlborg
1 2
Next ›   Last »