IgorShare Weblog

Practical Engineering

Archive for the ‘Alt.Net’ Category

Messaging Platform and Service Bus Resources

Posted by igormoochnick on 10/25/2009

On the recent project we’ve put in place a messaging platform. Apparently my engineers had a vague understanding what that is. To save you the same trouble I’ve gathered a bunch of interesting resources that can help you get up to date:

Open source Service Bus implementations

nServiceBus

MassTransit

WCF (misc)

Posted in Messaging, REST, Service Bus, WCF | Leave a Comment »

More information on MEF

Posted by igormoochnick on 01/02/2009

If you’re interested in Composite Applications in general and in MEF in particular – you may find Glen Block’s blog interesting.

Posted in Composite Applications, MEF | Leave a Comment »

Mocking, embedded-Jetty and expectations for outgoing HTTP requests in Java

Posted by igormoochnick on 09/05/2008

If your classes in Java are executing outgoing HTTP calls it’s not easy to unit-test them. In many cases it requires to set-up separate web servers and deploy a test-verification code. I’m going to give you a way to do it in-line, just as you do it with any other unit-test.

In order to do this we’ll use embedded-Jetty. We’ll host Jetty inside the unit-testing framework.

For our example I’m going to use a TestNG unit-testing framework, but, as you can guess, you’re welcome to use any other you see fit.

1. First of all we need to initialize Jetty. We’re going to do it in @BeforeClass method:

private Server server;
private String returnUrl;

@BeforeClass
@Parameters({ "test-jetty-port" })
public void setUpJetty(@Optional("8123") int testPort) throws Exception
{
	server = new Server(testPort);

	Handler handler = new AbstractHandler()
	{
	    public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
	        throws IOException, ServletException
	    {
	        handleHttpRequest(target, request, response);
	    }
	};

	returnUrl = "http://localhost:" + Integer.toString(testPort) + "/test";

	server.setHandler(handler);

	server.start();
}

2. In order to consume all the incoming HTTP traffic we’re going to define a handler (we’re going to discuss other opportunities in the following posts). Note that the incoming HTTP traffic is stored inside the HttpTester parser class:

private HttpTester requestTest = new HttpTester();

private String getRequestString(HttpServletRequest request) throws Exception
{
	ServletInputStream reqz = request.getInputStream();
	int contentLen = request.getContentLength();
	if (contentLen == -1)
		return request.toString();

	byte[] buff = new byte[contentLen];
	int realLen = reqz.read(buff);

	Assert.assertEquals(realLen, contentLen, "Content length from parameter should be equal to the real content length");

	return request.toString() + new String(buff);
}

public void handleHttpRequest(String target, HttpServletRequest request, HttpServletResponse response)
{
	try
	{
		requestTest.parse( getRequestString(request) );
	}
	catch(Exception e)
	{
		Assert.fail("Failed to parse the incoming request.", e);
	}

    response.setContentType("text/html");
    response.setStatus(HttpServletResponse.SC_OK);
    ((Request)request).setHandled(true);
}

3. And this is how you can define your test fixture:

@Test
public void jobReport_returns_POST_reply() throws Exception
{
    String xml = "<xml>some-data-here</xml>";

    object-to-test.send_post(returnUrl, xml);

    Assert.assertEquals(requestTest.getMethod(), "POST");
    Assert.assertEquals(requestTest.getURI(), "/test");
    Assert.assertEquals(requestTest.getContent(), xml);
}

4. After all the tests are done, don’t forget to shutdown the Jetty server:

@AfterClass
public void tearDownJetty() throws Exception
{
	server.stop();
}

Posted in Java, Jetty, Mocking, TestNG, Unit Testing | 1 Comment »

Where is my config file if my main module is not inside the executing folder?

Posted by igormoochnick on 09/04/2008

Some people ask me: “What if my bootstrapper is loaded by my application from a another (preconfigured) folder and my Prism/Unity config file located in the same (non-executing) folder? How do I load it?”

It’s pretty simple. You need to take your executing assembly as the base and figure out the required path.

var assembly = Assembly.GetExecutingAssembly();
Uri uriPath = new Uri(assembly.CodeBase);
string path = Path.Combine(Path.GetDirectoryName(uriPath.AbsolutePath), "myApp.config" );
var configMap = new ExeConfigurationFileMap { ExeConfigFilename = path  };
var configuration = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

unitySection = (UnityConfigurationSection)configuration.GetSection("unity");

modulesSection = (ModulesConfigurationSection)configuration.GetSection("modules");

Posted in IOC/DI, Prism, Tutorials, Unity | Leave a Comment »

Prism: File-configuration-driven bootstrapper

Posted by igormoochnick on 09/04/2008

If you’d like to extract all your application configuration into a config file, this is what you can do:

1. Create a config file. I suggest that you use a different file name than the App.config

2. Override ConfigureContainer method in your bootstrapper

private UnityConfigurationSection unitySection;

private void GetConfigurationSection()
{
    if  (unitySection == null)
    {
        var configMap = new ExeConfigurationFileMap { ExeConfigFilename = "myApp.config" };
        var configuration = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

        unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
    }
}

protected override void ConfigureContainer()
{
    base.ConfigureContainer();

    GetConfigurationSection();

    try
    {
        unitySection.Containers["global"].Configure(Container);
    }
    catch (Exception e)
    {
        System.Diagnostics.Trace.WriteLine(e.ToString());
    }
}

3. Point the module enumerator to the same config file via ConfigurationStore

protected override IModuleEnumerator GetModuleEnumerator()
{
    string baseDir = AppDomain.CurrentDomain.BaseDirectory;
    var store = new ConfigurationStore(baseDir);
    return new ConfigurationModuleEnumerator(store);
}

 

All this is fun, but, in case you have more than one config file that contains a Modules section – the ConfigurationStore will stop reading them as soon as it’ll find a first one. It may be the file that you needed in a first place, but, as well, it may be some other file.

Here is a simple workaround:

private UnityConfigurationSection unitySection;
private ModulesConfigurationSection modulesSection;

private void GetConfigurationSections()
{
    if ((unitySection == null) && (modulesSection == null))
    {
        var configMap = new ExeConfigurationFileMap { ExeConfigFilename = "myApp.config" };
        var configuration = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

        unitySection = (UnityConfigurationSection)configuration.GetSection("unity");

        modulesSection = (ModulesConfigurationSection)configuration.GetSection("modules");
    }
}

protected override void ConfigureContainer()
{
    base.ConfigureContainer();

    GetConfigurationSections();

    try
    {
        unitySection.Containers["global"].Configure(Container);
    }
    catch (Exception e)
    {
        System.Diagnostics.Trace.WriteLine(e.ToString());
    }
}

protected override IModuleEnumerator GetModuleEnumerator()
{
    GetConfigurationSections();

    return new ConfigurationModuleEnumerator(new MyConfigStore(modulesSection));
}

public class MyConfigStore : ConfigurationStore
{
    public ModulesConfigurationSection Section { get; private set; }

    public MyConfigStore(ModulesConfigurationSection section)
    {
        Section = section;
    }

    public override ModulesConfigurationSection RetrieveModuleConfigurationSection()
    {
        return Section;
    }
}

 

As you can see, by a simple overload of the ConfigurationStore, you can return exactly the modules section that you need. Note that this section is pre-retrieved by the same function that retrieves the “unity” configuration section.

Posted in IOC/DI, Prism, Tutorials, Unity, WPF | Leave a Comment »

Hosted Prism (or how to host Prism in the old projects)

Posted by igormoochnick on 09/02/2008

Recently I’m playing a lot with Prism and Unity and was looking for a way to gradually bring Prism to the existing projects. If you have an existing GUI project and you’d like to start using Prism (without rewriting everything from scratch) stay with me – I’m going to show a way that worked for me.

In order to work with Prism you need a “root” window, or, how they call it, a “shell” window. But what if you already have a window? There is a solution to that.

First of all create a WPF user control that will become a “shell” window to Prism. The XAML rules for this control is not different from any other Prism “shell” window. Just the root element of it is a “UserControl” and not “Window”. Let’s call it “ShellContainer”.

Then you need to attach this control to your existing application. But first you need to tell the Bootstrapper about it, but you don’t need to activate it:

   1: protected override DependencyObject CreateShell()
   2: {
   3:     return Container.Resolve<ShellContainer>();
   4: }

If your project is Windows Forms-based, you’ll need to drop on your form an ElementHost control. This control is located on the toolbox in the WPF Interoperability group. This will allow you to host a WPF User control on you non-WPF form.

   1: // Get the ShellContainer from IOC
   2: IUnityContainer container = new UnityContainer();
   3: var shellElement = container.Resolve<myLib.ShellContainer>();
   4:
   5: // Attach the WPF control to the host
   6: hostControl.Child = shellElement;

If you have a WPF form you can add this WPF User Control either manually.

   1: // Get ShellContainer from IOC
   2: IUnityContainer container = new UnityContainer();
   3: var shellElement = container.Resolve<myLib.ShellContainer>();
   4:
   5: // Add the ShellContainer UserControl to the main window
   6: this.mainGrid.Children.Add(shellElement);

From this point on you are on a home run – just follow the rest of the Prism guidelines.

TIP: I found it convenient to put the ShellContainer with the Bootstrapper in the same class library with the rest of the configuration logic. This allows a clean separation of the infrastructure from the rest of the logic of the Prism modules.

Posted in C#, IOC/DI, Prism, Tutorials, WPF | 1 Comment »

Retrieving a ShellContainer from Unity

Posted by igormoochnick on 09/01/2008

As I’ve mentioned in my previous post Hosted Prism, that you can add dynamically a Shell Container to your application. This time I’m going to show you how you can configure this container dynamically and have a possibility to replace it at any time without changing your code.

To do so I’m going to use a configuration file. It’s up to you to decide which one. You can use App.config, but I’ll recommend to have a separate file for your IOC, so the customers will not be exposed to a lot of nose and will not change stuff accidentally.

Create a config file (use any name you wish with .config extension – I’ll explain why in a different post).

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity>
    <typeAliases>

      <!-- Lifetime manager types -->
      <typeAlias alias="singleton"
           type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
               Microsoft.Practices.Unity" />

      <!-- User-defined type aliases -->
      <typeAlias alias="UIElement" type="System.Windows.UIElement, PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

      <typeAlias alias="Shell" type="OwlHollowLib.ShellContainer, OwlHollowLib" />

    </typeAliases>

    <containers>
      <container name="global">
        <types>
          <type name="Shell" type="UIElement" mapTo="Shell">
	<lifetime type="singleton" />
          </type>
        </types>
      </container>
    </containers>
  </unity>

</configuration>

Note that in the “container[@name=”global”]” I’m associating the “ShellContainer” user control with the type “UIElement” and assigning a “Shell” name for this object. As well I’m marking this object to be a singleton, but this is not necessary if you need more than one ShellContainer in your application.

And this is how you can get a reference to the ShellContainer:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        try
        {
            var configMap = new ExeConfigurationFileMap { ExeConfigFilename = "MyApplication.config" };
            var configuration = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);

            var section = (UnityConfigurationSection) configuration.GetSection("unity");

            IUnityContainer container = new UnityContainer();
            section.Containers["global"].Configure(container);

            var shellElement = container.Resolve<UIElement>("Shell");

            this.mainGrid.Children.Add(shellElement);
        }
        catch(Exception e)
        {
            System.Diagnostics.Trace.WriteLine(e.ToString());
        }
    }
}

As you can see, you need to initialize UnityContainer from a config file. If you are using a standard App.config file – you don’t need to create an ExeConfigurationMap.

As soon as the UnityContainer is initialized – it’s available for you to start resolving objects and types. The trick in the code above is to resolve your components by their parent types and by an associated name. You can see it in the line #17. This will allow you in the future to replace one UIElement with another without recompiling the application.

Note: DO NOT use the same name (in quotes) as an existing class. The resolution doesn’t work! It looks like the default resolving is conflicted with the resolve-by-name operation.

The technique described above allows you to decouple your modules and create … a loosely coupled but cohesive application.

If you want to take this technique to the extreme and make Unity calls from WPF, you can check the series of posts by Denis Vuyka [Injecting Xaml with Unity Application Block using Markup Extensions].

Stay tuned for more Prism and Unity posts.

Posted in IOC/DI, Prism, Tutorials, WPF | 1 Comment »

CodeCamp #10 [InTENsity] – see you at my presentations

Posted by igormoochnick on 08/28/2008

Note: Please forward this information to anyone who is interested.

The next CodeCamp #10 will be held in Waltham, MA on weekend September 20th and 21st.

For more information check Chris Bowen’s post.

Currently there are 33 submitted (and growing number of) presentations.

I’ll be presenting the “Toolbox for Agile Projects and Developers” and will be covering the topics like:

  • Agile Development Practices
  • TDD ( Test Driven Development)
  • Unit Testing
  • Mocking
  • IOC / DI (Inversion of Control / Dependency Injection)
  • ORM (Object Relational Mapping)
  • Code Coverage
  • Source Control
  • etc …

It appears that the amount of information is enormous, so I’ve decided to split these topics into 2 separate presentations.

See you all there …

Posted in Alt.Net, C#, Community, IOC/DI, Mocking, NHibernate, ORM, Presentations, Refactoring, Tutorials, Unit Testing | Leave a Comment »

Alt.Net Canada – Wish I was there!

Posted by igormoochnick on 08/26/2008

Bil Simser has done a terrific job of capturing the Alt.Net Canada event, it’s vibe and content. I wish more events will be captured. I, personally, will do everything in my power to make more events to be available for the people to see.

ALT.NET Canada – Day 1 – Immersion

ALT.NET Canada – Day 2 – DDD and more D

ALT.NET Canada – Day 2 – Noah, build me an Ark!

ALT.NET Canada – Day 3 – Coupling and Decoupling your Applications

ALT.NET Canada – Day 3 – Frameworks Fishbowl

ALT.NET Canada – Day 3 – The Sharing Circle

Posted in Alt.Net, DDDD, Tutorials | Leave a Comment »

Summer of NHibernate Screencast Series

Posted by igormoochnick on 08/25/2008

Pretty valuable resource for those who decides to take a look at NHibernate – Summer of NHibernate Screencast Series.

These series cover most of what you need to know about NHibernate, beginning from configuration, mapping, through querying and to very advanced issues, like interceptors.

Take a look.

Posted in Alt.Net, NHibernate, ORM, Tutorials | 1 Comment »