I recently went on a trip to Victoria and Vancouver for about a week. Here are some memorable foods from the trip.
1. Peaceful Garden Restaurant had great lamb cumin noodles. Their noodles are freshly made and cut right before cooking. I'm normally not a big fan of lamb, but I really enjoyed it.
2. Honey's Cafe in Deep Cove. Besides being beautiful and a great place to kayak, Deep Cove holds a secret treasure. Donuts. Go to the cafe and order one. They only have one kind, but to compensate, your donut is warm, soft, and delicious. Mmmm.
3. Last but certainly not least is Jimmy's Fruit Bar in the Lonsdale Quay. Being in business for a number of years, Jimmy has invented quite a variety of tasty and healthy drinks. My favorite while we stayed there was a drink called "Mr. Green Lifesaver." It's a delightful combination of mint, kale, spinach, pear, and mango, among other things. Tasty and refreshing. I'd highly recommend stopping by this friendly place for a great drink or two.
Wednesday, May 11, 2011
Monday, March 21, 2011
The Shrinking DLL Universe of NHibernate
There have been some interesting changes in the NHibernate universe recently. It used to be that you needed a whole bunch of DLLs and some extra config to do anything useful with NHibernate.
As of NHibernate 3.1, Antlr and Remotion have been ILMerged into the main dll, producing this picture.
As of NHibernate 3.2, there's now a default lazy proxy provider based on LinFu (thanks Philip). As well, this proxy provider is configured automatically, reducing a line of config required. This produces an even nicer picture for most users.
Now we just need to replace Iesi.Collections with the .NET 4 ISet and we'll only have one dll to reference. I have no idea when that will happen, but it's an interesting thought anyways.
- NHibernate
- Iesi.Collections
- Antlr.Runtime
- Remotion.Data.Linq
- NHibernate.ByteCode.Castle
- Castle.Core
As of NHibernate 3.1, Antlr and Remotion have been ILMerged into the main dll, producing this picture.
- NHibernate
- Iesi.Collections
- NHibernate.ByteCode.Castle
- Castle.Core
As of NHibernate 3.2, there's now a default lazy proxy provider based on LinFu (thanks Philip). As well, this proxy provider is configured automatically, reducing a line of config required. This produces an even nicer picture for most users.
- NHibernate
- Iesi.Collections
Now we just need to replace Iesi.Collections with the .NET 4 ISet and we'll only have one dll to reference. I have no idea when that will happen, but it's an interesting thought anyways.
WPF Lazy Proxy Revisited for NHibernate 3.2
When hooking up to PropertyChanged events, some systems require that the same object that a handler was registered with be the same object that throws the event. With NHibernate proxying, this can be a problem. The external viewer normally hooks up to the proxy object, but then the actual implementation object is the one throwing the property changed event, using "this" as a reference, which is naturally different from the proxy. This behavior occurs because the proxying is not entirely transparent. Even though the user hooks up to the proxy object and expects events from the proxy object, the real object throws the events, messing with handlers that may be stored in dictionaries mapped by the sender. See my first post for other details on this same problem.
The original solution to this problem modified the Castle bytecode provider. Now, with NHibernate 3.2, there is a default provider built-in. Here is the new code with the fix for the PropertyChanged event. Using this code fixes problems with WPF and libraries like Obtics.
The original solution to this problem modified the Castle bytecode provider. Now, with NHibernate 3.2, there is a default provider built-in. Here is the new code with the fix for the PropertyChanged event. Using this code fixes problems with WPF and libraries like Obtics.
Tuesday, December 7, 2010
Linq Expression Evaluation
If you have a Linq Expresssion (such as a reference to a variable in the closure) or really any other self-contained fragment, you can easily evaluate it by turning it into a lambda expression. For example, I was trying to evaluate the content of a variable that was showing up as a ".x" field. To do so, I did the following:
Saturday, December 4, 2010
NHibernate 3.0
NHibernate 3.0.GA has been released! It has all sorts of goodies like QueryOver, logging abstraction, and tons more. It also now has a built-in LINQ provider. Unfortunately, the LINQ provider is still in a beta state. Many queries work (as evidenced by the hundreds of working unit tests), but there are also still many queries it has trouble with. If you'd like to help accelerate the development of the LINQ provider (or any other part of NH for that matter), here's what you can do:
With your help, we will work towards a rock solid LINQ release that matches the tremendous power and reliability already provided by the NHibernate platform.
- File issues when you find bugs. http://jira.nhforge.org/
- Vote for issues. Popularity is difficult to gauge if we don't hear back from people.
- Provide test cases for those issues. A complete test case is easier to digest than a tiny code fragment without context. If the test can be used directly, the team member working on the issue can spend more of their time making improvements instead of trying to recreate a test.
- If you're feeling ambitious, dig into the source code and try to work out a fix.
There's a great article on making tests for NHibernate here. I've also included some different steps that might help you out.
- Check out the trunk using something like TortoiseSVN (https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate)
- Use ShowBuildMenu.bat to create the AssemblyInfo.cs files.
- Load up NHibernate.Everything.sln in Visual Studio.
- Create a test with the issue number in the NHSpecificTest folder of the NHibernate.Test project (NH2392 is a fairly simple example to copy from).
- Use ShowBuildMenu.bat to see how to set up your database connection and run all the tests.
- Create a patch (TortoiseSVN can help you with this) and attach it to the JIRA issue.
Sunday, September 26, 2010
Interesting Changes in NHibernate 3.0
There are tons of new features in NHibernate 3.0. I'm going to highlight a few minor interesting ones from my view.
Client Profile Support
The .NET client profile is now supported out of the box. Castle.Core also supports the client profile as well, so the Castle bytecode provider will work out of the box as well. Great news for those who write desktop apps.
Logging Abstraction
In getting support for the client profile, log4net was an issue. It hasn't been updated in ages and doesn't support the client profile itself. This issue combined with other people's desire for a logging abstraction now means that NHibernate supports pluggable loggers. You can use the NHibernate.Logging package to get support for libraries such as Common.Logging. This also enables use of the excellent NLog framework, which is actively updated.
Polymorphism in Get and Load
Previously, Get and Load methods on the session required the exact mapped type. Now, they allow you to specify a class or interface higher up the inheritance hierarchy, as long as there's only one match. This will allow people to eliminate their own mapping layers when it comes to retrieving objects by primary key. Importantly, this will make ActiveRecord work much better with interfaces.
Fixes for IdBag
The identifier bag had a bunch of bugs, especially ones that manifest themselves more when used in rich client applications. If you had problems before, try it again.
ISQLFunction Argument Repetition
[Update: This will not be included in 3.0]
Though it's not in the trunk, I'm also excited about the potential inclusion of NH-2318. This will let us write functions for dialects that have non-trivial argument patterns. For example, a NullSafeEquals function could be written as (?1 IS NULL AND ?2 IS NULL) OR (?1 IS NOT NULL AND ?2 IS NOT NULL AND ?1 = ?2). With the current code, such a function breaks because it repeats arguments. The patch also deals with argument reording or removal, but it doesn't support ordinal parameters at the moment. We'll see if this one happens to make it in.
All in all, NHibernate 3.0 is a very exciting release that many contributors have put a lot of hard work into.
Client Profile Support
The .NET client profile is now supported out of the box. Castle.Core also supports the client profile as well, so the Castle bytecode provider will work out of the box as well. Great news for those who write desktop apps.
Logging Abstraction
In getting support for the client profile, log4net was an issue. It hasn't been updated in ages and doesn't support the client profile itself. This issue combined with other people's desire for a logging abstraction now means that NHibernate supports pluggable loggers. You can use the NHibernate.Logging package to get support for libraries such as Common.Logging. This also enables use of the excellent NLog framework, which is actively updated.
Polymorphism in Get and Load
Previously, Get and Load methods on the session required the exact mapped type. Now, they allow you to specify a class or interface higher up the inheritance hierarchy, as long as there's only one match. This will allow people to eliminate their own mapping layers when it comes to retrieving objects by primary key. Importantly, this will make ActiveRecord work much better with interfaces.
Fixes for IdBag
The identifier bag had a bunch of bugs, especially ones that manifest themselves more when used in rich client applications. If you had problems before, try it again.
ISQLFunction Argument Repetition
[Update: This will not be included in 3.0]
Though it's not in the trunk, I'm also excited about the potential inclusion of NH-2318. This will let us write functions for dialects that have non-trivial argument patterns. For example, a NullSafeEquals function could be written as (?1 IS NULL AND ?2 IS NULL) OR (?1 IS NOT NULL AND ?2 IS NOT NULL AND ?1 = ?2). With the current code, such a function breaks because it repeats arguments. The patch also deals with argument reording or removal, but it doesn't support ordinal parameters at the moment. We'll see if this one happens to make it in.
All in all, NHibernate 3.0 is a very exciting release that many contributors have put a lot of hard work into.
Tuesday, December 8, 2009
Obtics
If you're working with .NET and any sort of observability, such as WPF bindings, you owe it to yourself to check out Obtics. It's an excellent library that turns an expression into an observable expression. It has full support for System.Linq.Enumerable methods and for arbitary expressions.
Using Obtics and a custom helper method, you can do things like:
Now, whenever A or B change, a property changed notification is fired for AplusB.
Imagine now that the expression inside is not as simple as A + B but several lines of code involving collections, linq extension methods, and more. Obtics is able to automatically add observability to the entire complex expression.
Need to watch for changes to proerties in collections? Obtics has elegant ways of doing that too. It's a great library, very much worth checking out. In comparison to CLINQ or Bindable LINQ, Obtics has a focus on full expression support. Having full expression support is extremely powerful and Obtics seems to be an excellent implementation of it.
Using Obtics and a custom helper method, you can do things like:
public int AplusB
{
get
{
return Getter(() => AplusB, () =>
A + B
);
}
}
Now, whenever A or B change, a property changed notification is fired for AplusB.
Imagine now that the expression inside is not as simple as A + B but several lines of code involving collections, linq extension methods, and more. Obtics is able to automatically add observability to the entire complex expression.
Need to watch for changes to proerties in collections? Obtics has elegant ways of doing that too. It's a great library, very much worth checking out. In comparison to CLINQ or Bindable LINQ, Obtics has a focus on full expression support. Having full expression support is extremely powerful and Obtics seems to be an excellent implementation of it.
Subscribe to:
Posts (Atom)